PerlのDBIでMySQLにShift JISの日本語のデータを挿入する。
DBIでプレースホルダを使用して、Shift JISの日本語でかつ文字コードが0x5cで終わるデータをinsertするとエラーになってしまう。
use DBI;
my $dbh = DBI->connect('DBI:Mysql:test', 'testuser', 'testpwd');
$dbh.do("insert into table ( name ) values(?)",undef,'表')|| die $dbh->errstr;
本当はhttp://www.klab.jp/media/mysql/index6.htmlにあるようにmysql_set_character_set()が使えればいいのですが、比較的最近、追加されたAPIなので使えないパターンがあると思います。
ネットで探しても、Shift JISを使うなの一点張りですが、それ派、私にではなく、Docomoに言ってくれと思います。
そこで、MySQLはHEX文字で記述された文字コードをUNHEXという関数で文字に直すということができるため、UNHEXを使うようにしたところ、問題が起きなくなりました。 下記がそのコードです。
sub _to_hex_str{
my( $str ) = @_;
my @codes = unpack("C*",$str);
my $code_format;
my $code_str;
foreach my $code (@codes){
$code_format .= "%x"
}
$code_str = sprintf $code_format,@codes;
return $code_str;
}
my $dbh = DBI->connect('DBI:Mysql:test', 'testuser', 'testpwd');
$dbh.do("insert into table ( name ) values(UNHEX('" . _to_hex_str($name) . "'))")|| die $dbh->errstr;
ネットで見かけなかった解決方法なので何か不都合があるかもしれません。
もし、問題がありそうだったら、教えてください。
| 固定リンク
「perl」カテゴリの記事
- auとdocomoのIPアドレス帯域のチェックツール(2010.02.23)
- PerlのDBIでMySQLにShift JISの日本語のデータを挿入する。(2010.01.26)
- Perlへの懺悔(2010.01.24)
コメント
検索して辿り着きました。
素晴らしいアイデア、感謝しながら頂戴します!!!
投稿: 通りすがり | 2010年2月 8日 (月) 20時25分
DBD::mysqlPPrawSjis がありますよ
投稿: とおりすがり | 2010年8月15日 (日) 11時04分
$dbh.do("insert ...
↑ドット表記
INSERT ではなくて . (ドット)でエラーになっていませんか?
投稿: PostgreSQLはじめました | 2011年11月11日 (金) 17時37分