プロが教えるわが家の防犯対策術!

お世話になります。
環境は
windows2000pro
perl 5.8.8
mysql 5.0.22
です。
mysqlの文字コード関連の設定はmy.iniにてsjisに統一してあります。
DBIを使って、perlスクリプトからmysqlのテーブルへ「表」という文字をインサートしようとするとエラーになります。mysqlクライアントからならちゃんと「表」もインサートできました。
エラーは以下のようになっています。

You have an error in your SQL syntax; check the manual that corresponds to your
MySQL server version for the right syntax to use near ''表\')' at line 1表

とにかくインサートしようとする文字列の最後の文字が「表」なら同様のエラーになります。
「表示」なら問題なくインサートできます。表の2バイト目が5cなのがまずいと思うのですが、どう対処すればよいかわかりません。
ヒントを下さい。よろしくお願いします。

-----
use strict;
use DBI;
use Encode qw(from_to);
my $str = "表";
from_to($str,'utf8','shiftjis');
eval {
my $dbh = DBI->connect(
'dbi:mysql:test,hostname=localhost',
'root','bnogl399',{ RaiseError => 1, PrintError => 0});
$dbh->do("set names sjis");
$dbh->do("use mydb");
$dbh->do("insert into foo values (3, " . $dbh->quote($str) . ")");
$dbh->disconnect();
};

print $DBI::errstr if $@;

A 回答 (5件)

sjisです。


回答にZIPファイルを添付できなかったのでSkyDriveに
置いておきました。

mysqlPPrawSjis.zip
http://cid-78738881dea16832.skydrive.live.com/se …

参考URL:http://cid-78738881dea16832.skydrive.live.com/se …
    • good
    • 0

PurePerl版のMySQLのDBDモジュール(mysqlPP)を元にして試しに


作ったものがあるので参考になれば幸いです。
    • good
    • 0

>use Encode qw(from_to);


の前後に
use utf8;
これで

>my $str = "表";

は問題無し。次に

>$dbh->do("insert into foo values (3, " . $dbh->quote($str) . ")");

これは、prepared statement を使って

my $statement= $dbh->prepare("insert into foo values (?,?)");
$statement->execute(3,$str);

エラー処理のために eval{ ... }; でくるむのがいいと思いますが。
    • good
    • 0

MySQLの環境が無いので試せないのですが、文字列はシングルクォーテーションで囲ってもOKのはず。


何か展開のルールがダブルクォーテーションと違うはず。
うろおぼえでごめんなさい。

なので

my $str = '表';

ではどうでしょう?
    • good
    • 0
この回答へのお礼

こんな時間にどうもありがとうございます。
やってみましたがだめでした。
perlでは""と''では確かに展開のルールが違いますが「\」単独に関しては同じ解釈がされたと思います。
my $str = '表';
としたら表(955c)の2バイト目の5cが\と解釈された
my $str = '95\';
となってしまい、二つ目の'がエスケープされてしまいます。

お礼日時:2006/06/23 00:57

my $str = "表\";



でどうでしょう?
    • good
    • 0
この回答へのお礼

ありがとうございます。
"表\"としてしまうと最後の"が\でエスケープされてしまい、スクリプトを実行してもごちゃごちゃとしたエラーになります。
そこで
$str = "表\\";
としてみましたが

You have an error in your SQL syntax; check the manual that corresponds to your
MySQL server version for the right syntax to use near ''表\\\')' at line 1表\

と同様なエラーになります。

すみません、書き忘れてしまったのですが、たとえ"表\"がうまくいったとしても、
それでは「表」という文字にしか対応できません。そうではなくて、
表に限らず2バイト目が5cになっている他のあらゆる文字に関しても、
問題なくmysqlで扱えるようにしたいのです。

お礼日時:2006/06/23 00:00

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!