質問: $dbh->prepare( "insert into test values( ? )" ); $sth->bind_param( 1, $string ); $sth->execute; $sth->finish; $dbh->commit; $dbh->disconnect; 上記のソースを実行すると、mysql 4.1 サーバーには [あ?あ?あ] のような、余計なエスケープが掛かった状態で文字がinsert されているのです。 私としては、set names utf8 で、mysql 4.1 サーバーとクライアントで同様の文字コードを使うようにしているので、mysql 4.1 における余計な文字コード変換はないものと思っています。余計な文字コード変換がないにもかかわらずエスケープ文字が入る理由が分かりません。 この現象についてお分かりの方がいらっしゃいましたら教えて頂きたく思います。なお、ネットでも調べたのですが、どの方も未解決でしたので質問さえて頂きました。 お願いします。
回答: まぁ、 perlしか叩かない人には、理解する機会すら無い事象なので、 食って掛かりたくなるんでしょうね。 今回の根本原因は、set names statementで指定した情報が、 mysql client library関数に反映されない為。 これは、言い換えると クライアントからサーバへ送信後、サーバ上で解釈される sql queryが クライアント側内部動作であるmysql client library関数に 影響を与えることができない為。 perl dbi経由のアクセスは、mysql client library関数を内部で利用しています。その為、sql的に正しい操作であっても、perl dbi的に誤りとなるケースがあるんですよ。