スクリプトはEUC,データベースの文字コードはSJISで構成されています。
Linux上で構成されたMySQLのバージョンは4.0.27です。
SHIBA というテーブルに「芝浦」「東芝」というデータが入っていて、
「芝」を含むデータを選択したいと思っているのですが、
use Jcode;
use DBI;
$code="%".jcode('芝')->sjis."%";
$db = DBI->connect('DBI:mysql:host', $user, $passwd);
$sqlbun="select * from SHIBA where koumoku like ?;";
$sth = $db->prepare($sqlbun);
$sth->execute($code);
$sth->finish;
$db->disconnect;
これで選択できません。
「芝浦」や「東芝」と指定すると、選択できます。
「浦」でも選択できます。
プレースホルダを使用しないで、
$sqlbun="select koumoku from SHIBA where koumoku like '%芝%';";
$sth = $db->prepare(jcode($sqlbun)->sjis);
$sth->execute();
とすると選択できます。
MySQLのログを見ると、
select koumoku from SHIBA where koumoku like '%ナ%'
となっています。(↑の「ナ」は半角で入っていました)
これは何が原因なのでしょうか?
MySQLの文字コード・バージョンを変更する以外に
対処方法はないでしょうか?
文字コードを見てみると、
sjisの「芝」、euc-jpの「ナ(半角)」が共に"8E C5"のようです。
http://www.shtml.jp/mojibake/hankaku_euc.html
おそらくprepareした時点で文字コードがeucなので、
そこに$codeを入れることに問題があるようです。
プレースホルダーを使わないってのはダメですか?
ありがとうございます。なるほど、芝とナは同じ文字コードなんですね。
上記URLを見ると、他にもこのような動作をしてしまいそうな感じがありますね。。
でもなぜ「芝浦」では絞り込めるのでしょうかね?・・・
プレースホルダーを使用しない、となるとどのような方法がありますでしょうか?