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とすると
正常に書き込まれる。