- 締切済み
DBD::mysqlで「表」という文字をテーブルへインサートしたい
お世話になります。 環境は 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 $@;
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- sjis
- ベストアンサー率0% (0/0)
sjisです。 回答にZIPファイルを添付できなかったのでSkyDriveに 置いておきました。 mysqlPPrawSjis.zip http://cid-78738881dea16832.skydrive.live.com/self.aspx/%e5%85%ac%e9%96%8b/mysqlPPrawSjis.zip?ccr=9592
- sjis
- ベストアンサー率0% (0/0)
PurePerl版のMySQLのDBDモジュール(mysqlPP)を元にして試しに 作ったものがあるので参考になれば幸いです。
- vsba23895
- ベストアンサー率58% (18/31)
>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{ ... }; でくるむのがいいと思いますが。
- bin-chan
- ベストアンサー率33% (1403/4213)
MySQLの環境が無いので試せないのですが、文字列はシングルクォーテーションで囲ってもOKのはず。 何か展開のルールがダブルクォーテーションと違うはず。 うろおぼえでごめんなさい。 なので my $str = '表'; ではどうでしょう?
- bin-chan
- ベストアンサー率33% (1403/4213)
my $str = "表\"; でどうでしょう?
お礼
ありがとうございます。 "表\"としてしまうと最後の"が\でエスケープされてしまい、スクリプトを実行してもごちゃごちゃとしたエラーになります。 そこで $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で扱えるようにしたいのです。
お礼
こんな時間にどうもありがとうございます。 やってみましたがだめでした。 perlでは""と''では確かに展開のルールが違いますが「\」単独に関しては同じ解釈がされたと思います。 my $str = '表'; としたら表(955c)の2バイト目の5cが\と解釈された my $str = '95\'; となってしまい、二つ目の'がエスケープされてしまいます。