[前][次][番号順一覧][スレッド一覧]

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


[前][次][番号順一覧][スレッド一覧]