mysql:11806
From: <sakaguchi@xxxxxxxxxx>
Date: Tue, 26 Jul 2005 16:45:26 +0900
Subject: [mysql 11806] perl DBIでプレースホルダ置換を行うと余計なescape処理
さかぐちといいます。よろしくおねがいします。 perlにより、utf8の日本語データを次の方法でMySQLに書き込むと、 escape処理されたような、 余分なバックスラッシュが挿入されてしまいます。 (方法) DBI connect->set names utf8->prepare->bind_param->execute bind_paramを行わなければ正常に書き込まれます。 環境は次の通りです。 ・RedHat Linux 9 ・Perl 5.8.0 ・Jcode 2.03 ・データベース DBI-1.48 DBD-mysql-2.9008 MySQL 4.1.11 Server characterset: ujis Db characterset: ujis Client characterset: ujis Conn. characterset: ujis 以下はテストを行ったスクリプトで、eucで書いています。 MySQLのテーブルカラムは次の通りです。 (1)int(11) (2)varchar(50) (3)varchar(255) (4)mediumtext ---- ここから ---- #!/usr/bin/perl use DBI; use DBI qw(:sql_types); use Jcode; #$bind = 1; $bind = 0; $user = 'foo'; $passwd = 'bar'; $id = 9; $d1 = "あいうえおアイウエオABCDABCD12341234"; $d2 = "かきくけこ カキクケコ"; $d3 = "abcdefgABCDEFG12345678901234567890"; print "$d1, $d2, $d3 \n"; $data1 = Jcode->new($d1, 'euc')->utf8; # utf8 $data2 = Jcode->new($d2, 'euc')->utf8; # utf8 $data3 = Jcode->new($d3, 'euc')->utf8; # utf8 $dbh = DBI->connect('DBI:mysql:xx:localhost', $user, $passwd); #$dbh->do("set names ujis"); $dbh->do("set names utf8"); if($bind) { $sth = $dbh->prepare ("insert into xx_data values($id, ?, ?, '$data3')"); $sth->bind_param(1,$data1,SQL_VARCHAR); $sth->bind_param(2,$data2,SQL_VARCHAR); } else { $sth = $dbh->prepare ("insert into xx_data values($id, '$data1', '$data2', '$data3')"); } $sth->execute; $sth->finish; $dbh->disconnect; ---- ここまで ---- テーブルには次の様に書き込まれます。 (1)$bind=1の場合 8 あ\いう\えお\アイウエオABCDABCD12341234 か\きくけ\こ カキクケコ abcdefgABCDEFG12345678901234567890 (2)$bind=0の場合 9 あいうえおアイウエオABCDABCD12341234 かきくけこ カキクケコ abcdefgABCDEFG12345678901234567890 (3)日本語データをutf8に変換せずeucのままとし、 set namesを行わないで prepare->bind_paramとすると 正常に書き込まれる。