- 締切済み
MYSQL4.0.27でLIKE検索ができない
初心者です。 過去ログを漁ったりしたのですが、どうしてもわからなかった為 質問させていただきました。 XSERVER http://www.xserver.ne.jp/ で携帯用サイトを開発しているのですが、 ユーザー投稿型のサイトを作っています。 そこで、投稿された情報の中で 日本語、英語のまじったLIKE検索を 他ユーザーができるようにしたいのですが 検索結果がまったく一致しません。 文字コードについては、以下の通りです。 ------------ character set ujis character sets latin1 big5 czech euc_kr gb2312 gbk latin1_de sjis tis620 ujis dec8 dos german1 hp8 koi8_ru latin2 swe7 usa7 cp1251 danish hebrew win1251 estonia hungarian koi8_ukr win1251ukr greek win1250 croat cp1257 latin5 ------------ OSはLinux系です。 文字コードがujis で設定されているため PHP側の構文の問題なのかな。。。。 という状態なのですが、全く解決方法がわかりません。 #クエリー記述 $query1 = "SELECT s_num,s_name,s_url,s_txt FROM site_data WHERE s_name LIKE '%{$keyword}%'"; ※s_nameはサイト名が記載されている。 検索窓で、このサイト名についてLIKE検索させ 該当結果を出したいのですが。。。。 $keywordをあらかじめエンコードするなどの PHP側で処理が必要なのでしょうか。 こんなレベルで大変恐縮なのですが どなたかご教授いただけませんでしょうか。 何卒、どうぞ、よろしくお願い申し上げます。 4.0.27
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- hrm_mmm
- ベストアンサー率63% (292/459)
sjisだと、2バイト目が0x05のバックスラッシュが入ってるせいで、sql文の解釈が壊れたりするので、それでなくても、postやgetで得たデータは、何が入ってるか解らないので、必ずescapeして渡すこととか、 多バイト文字のバイト列がずれないように適合させるには BINERY を指定するとかいう配慮も必要です。既にカラム型に BINERY を指定してあるならこれは不要ですけど。 $query1 = "SELECT s_num,s_name,s_url,s_txt FROM site_data WHERE BINERY s_name = '" . mysql_real_escape_string ('●●●●●') ."'"; これらが原因かどうかは、実際に既に入ってるデータがどうなってるのかとかも調査が必要ですけど。 一応、MySQL4.0代なら、MySQLサーバー側がどうあれ、SQL文に書いたバイト列(キャラクターセット)でそのまま格納されているはずだけど。 入れるときにescapeしてないなら既に壊れて入ってる可能性もあります。 where節を書かないで、全ての適切なデータを取得できますか? 一遍に表示するには件数が多すぎるならlimit で分割してみて下さい。
- shimix
- ベストアンサー率54% (865/1590)
スクリプトもMySQL内のデータもSJISですよね。 4.0系なのでSET NAMESは不要だと思います。そのまま入れて、そのまま取り出せるハズなんですけどね。SET NAMESは「動かない」となってから入れたんですよね?最初から入れていたのならSET NAMESが悪さしてる可能性もありますがそういう流れではなさそうですし・・。 #書くとしたらSJISだし、書かないほうがいいです。 今現在テーブルに「SJISで保存されている」ことは確認できますか?
- shimix
- ベストアンサー率54% (865/1590)
最後に(何の説明もなく)書かれた4.0.27がMySQLのバージョンですよね?Likeでなければ(完全一致なら)検索できるのでしょうか? >$keywordをあらかじめエンコードするなどの >PHP側で処理が必要なのでしょうか。 $keywordの文字コードは何ですか?スクリプトの文字コード(mb_internal_encoding)がEUC-JPで、POSTされたデータの文字コードが違う場合、それに変換していますか? これ↑はテーブルにinsertしているスクリプトも同様です。
補足
#質問者kunihisa124です。 >$keywordの文字コードは何ですか?スクリプトの文字コード(mb_internal_encoding)がEUC-JPで、POSTされたデータの文字コードが違う場合、それに変換していますか? 現状、携帯用サイトとして開発しているため、 全てphpは、SHIFT-JISで作成しています。 ですので、POSTも全てshift-jisで投げていると思います。 MYSQLの設定を確認してみるため、 「SHOW VARIABLES LIKE 'char%';」 で実行した所、以下の設定内容でした。 ------------------------- Variable_name Value character_set ujis character_sets latin1 big5 czech euc_kr gb2312 gbk latin1_de sjis tis620 ujis dec8 dos german1 hp8 koi8_ru latin2 swe7 usa7 cp1251 danish hebrew win1251 estonia hungarian koi8_ukr win1251ukr greek win1250 croat cp1257 latin5 ------------------------- これをみる限り、MYSQL側は、ujis(EUC-JP)ということなのかなと 思い、DB接続用のclassファイルで、 以下のように記載してみました。 ------------------------- function conndb(&$conn) { $ip = $this->ip; $sqlid = $this->sqlid; $sqlpass = $this->sqlpass; $dbname = $this->dbname; $conn = mysql_connect("$ip", "$sqlid", "$sqlpass"); if(! $conn){ return 0; } mysql_select_db($dbname, $conn); $query = "SET NAMES ujis"; mysql_query($query); return 1; } ------------------------- でも、結局結果は同様にダメでした。 無理やり SET NAMES sjis として、sjisでデータをやり取りさせるように してみたのですが、それも無理でした。 ご指摘いただいた完全一致についても $query1 = "SELECT s_num,s_name,s_url,s_txt FROM site_data WHERE s_name = '●●●●●'"; で検索してみたのですが、ダメです。 MySQLのver3のサーバーを借りなおした方がいいのかなと 悩み始めてます・・・・