« Perlへの懺悔 | トップページ | Amazon S3にバックアップをする2 »

2010年1月26日 (火)

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への懺悔 | トップページ | Amazon S3にバックアップをする2 »

perl」カテゴリの記事

コメント

検索して辿り着きました。
素晴らしいアイデア、感謝しながら頂戴します!!!

投稿: 通りすがり | 2010年2月 8日 (月) 20時25分

DBD::mysqlPPrawSjis がありますよ

投稿: とおりすがり | 2010年8月15日 (日) 11時04分

$dbh.do("insert ...
  ↑ドット表記

INSERT ではなくて . (ドット)でエラーになっていませんか?

投稿: PostgreSQLはじめました | 2011年11月11日 (金) 17時37分

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/68673/47392285

この記事へのトラックバック一覧です: PerlのDBIでMySQLにShift JISの日本語のデータを挿入する。:

« Perlへの懺悔 | トップページ | Amazon S3にバックアップをする2 »