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

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 &amp; BLOB                         
->    8951 2004-03-11 16:22 ┗[<gcd00051@xxxxxxxxxx]