MySQL+perlがうまく動きません。

スクリプトは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の文字コード・バージョンを変更する以外に
対処方法はないでしょうか?

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2006/07/05 23:10:35
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:heilig_zwei No.1

回答回数119ベストアンサー獲得回数13

ポイント60pt

文字コードを見てみると、

sjisの「芝」、euc-jpの「ナ(半角)」が共に"8E C5"のようです。

http://www.shtml.jp/mojibake/hankaku_euc.html

おそらくprepareした時点で文字コードがeucなので、

そこに$codeを入れることに問題があるようです。

プレースホルダーを使わないってのはダメですか?

id:bonyan

ありがとうございます。なるほど、芝とナは同じ文字コードなんですね。

上記URLを見ると、他にもこのような動作をしてしまいそうな感じがありますね。。

でもなぜ「芝浦」では絞り込めるのでしょうかね?・・・

プレースホルダーを使用しない、となるとどのような方法がありますでしょうか?

2006/07/05 15:20:10
  • id:bonyan
    たぶん?解決しました。MySQLの問題というよりは、
    文字コードの問題みたいでした。
    jcode() で変換する際に、変換前の文字列の文字コードを指定すればよかったようです。heilig_zweiの回答がヒントになりました。
    ありがとうございました。
  • id:bonyan
    敬称が抜けてました。heilig_zweiさん、失礼しました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません