mysql:8951
From: <gcd00051@xxxxxxxxxx>
Date: Thu, 11 Mar 2004 16:22:33 +0900 (JST)
Subject: [mysql 08951] Re: sjis & BLOB
川合孝典です。 ----- Original Message ----- >Date: Thu, 11 Mar 2004 12:08:58 +0900 >From: Hiroaki Sengoku <sengoku@xxxxxxxxxx> >Subject: [mysql 08949] sjis & BLOB >To: ml@xxxxxxxxxx > > >仙石と申します。既知の問題とは思いますが、あまり知られていない問題である >ような気もしますので、まとめとして報告します。 > > default-character-set=sjis としていると、 > BLOB 型のデータを挿入/更新する時、 > 0x81 〜 0x9F ないし 0xE0 〜 0xFC の次に > エスケープ文字が来ても無視される (以下略) 単純にきちんとエスケープしていないだけのように思われますが? 今のコードのままでは挿入する値としてシングルクォートがはいったとしても きちんと動かないでしょう。 #PHPならaddslashesで大丈夫だと思いましたが... DBIではプレースホルダ+バインド変数というのが基本的な処理になります。 use strictをつけて、簡単に検証できるように変更してみました。 時間がなくて完全な検証までしていませんが、試してみてください。 #!/usr/bin/perl use strict; use DBI; my $sCnt=''; for (my $i=112; $i < 256; $i++) { $sCnt .= sprintf("%c\\0", $i); } my $sql = "INSERT INTO blobtest(data) VALUES ('$sCnt')"; my $db_url = "dbi:mysql:test:localhost"; my $db_user = 'test'; my $db_password = ''; my $dbh = DBI->connect($db_url, $db_user, $db_password, { PrintError => 1, RaiseError => 0 }); if (!defined($dbh)) { print "[NG] connect:\t" . $DBI::errstr; exit 1; } $dbh->do('DELETE FROM blobtest'); my $sth = $dbh->prepare($sql); if(!(my $rv = $sth->execute())){ print "[NG] execute:\t$rv:$dbh->err:$dbh->strrstr:$dbh->state\n"; exit(1); } print $dbh->selectrow_array('SELECT data FROM blobtest'); $dbh->do('DELETE FROM blobtest'); my $sth = $dbh->prepare('INSERT INTO blobtest(data) VALUES(?)'); if(!(my $rv = $sth->execute($sCnt))){ print "[NG] execute:\t$rv:$dbh->err:$dbh->strrstr:$dbh->state\n"; exit(1); } print $dbh->selectrow_array('SELECT data FROM blobtest');
8949 2004-03-11 12:08 [Hiroaki Sengoku <sen] sjis & BLOB -> 8951 2004-03-11 16:22 ┗[<gcd00051@xxxxxxxxxx]