人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

MySQL+PHPで日本語検索(SELECT文)ができません。


現在MySQLとPHPを使った(フレームワークとしてcakephpを使用しています)ウェブシステムの構築をしてます。

そこで、テストサーバ(XREAのphp5サーバです)でうまくいったものを本サーバー(さくらの専用サーバーFreeBSD使用)にアップしたところ、日本語のSELECT文に反応しなくなってしまいました。

SQL文はこちらです。
SELECT `Hoge`.`prefecture` FROM `hoges` AS `Hoge` WHERE prefecture="北海道"

日本語以外のパラメータでSELECT文を入れてみたら正常に動作しました(例えばid=5など)。
文字コードはサーバ・MySQLではUTF8を使用しており、クライアントは携帯対応を考えているためSJISにしてます。
テストサーバは
SET NAMES SJIS
を入れることで問題なく進んだんですが、
本サーバでは、SET NAMES SJISでもUTF8でも駄目でした。

また、
mb_convert_encodingを使ってSJISとUTF8で同じ文字を同時に検索させてみたんですがそちらも駄目でした。

なお、本サーバをいじる権限がないので、プログラムだけで対応できる施策を探しています。
以下、テストサーバと本サーバーのMySQLです。
テストサーバー(XREA+)
MySQL: 5.1.22-rc
本サーバ
MySQL: 5.0.45

●質問者: lemolemo75
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:as CakePHP FreeBSD hoge MySQL
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● ffmpeg
●27ポイント

mysql_query('set character set sjis');

◎質問者からの返答

回答ありがとうございます!

SET NAMES SJISを消してset character set sjisを入れてみたんですが、駄目でした。

また、両方同時に入れても同様でした。

これってMySQLのバージョンのせいなんでしょうか?


2 ● bayan
●27ポイント

SELECT文に反応しない状況は、結果の件数が 0 件なのか、

それともSQLの実行がエラーになっていたりするのか気になりました。

$rs = mysql_query($sql);

if($rs){

echo mysql_num_rows($rs) . "件";

}else{

echo "Error";

}

はずしているかもしれませんが、試しに文字列を囲むのに " ではなく ' を使ってみるとどうでしょうか。

SELECT `Hoge`.`prefecture` FROM `hoges` AS `Hoge` WHERE prefecture='北海道'

MySQLサーバがANSIモードで動作していると、

文字列の引用に二重引用符を使用することはできない。二重引用符を使用すると、識別子として解釈されてしまうためである。

ということがあるみたいです。

詳しくは、

http://dev.mysql.com/doc/refman/4.1/ja/ansi-mode.html

http://dev.mysql.com/doc/refman/5.1/ja/server-sql-mode.html

先に

SET sql_mode = '';

を実行すれば " でも通りそうですが未確認です。。。


あと文字コードがらみですが、 で、

mbstring.xxx (mbstring.internal_encoding 等) がどうなっているか、両方のサーバの設定をくらべて見るとどうでしょうか。

すでになさっていたらごめんなさい。

◎質問者からの返答

回答ありがとうございます!

説明不足すいません。SELECT文に反応しないというのは、結果が0件ということです。エラーは出ません。

シングルクオートにしてみたんですが、結果は同じでした。

phpinfo();で調べてみました。

本サーバ

mbstring.detect_orderno valueno value

mbstring.encoding_translationOnOn

mbstring.func_overload00

mbstring.http_inputpasspass

mbstring.http_outputpasspass

mbstring.internal_encodingEUC-JPEUC-JP

mbstring.languageJapaneseJapanese

mbstring.strict_detectionOffOff

mbstring.substitute_characterno valueno value

テストサーバ

mbstring.detect_orderautoauto

mbstring.encoding_translationOffOff

mbstring.func_overload00

mbstring.http_inputautoauto

mbstring.http_outputpasspass

mbstring.internal_encodingUTF-8UTF-8

mbstring.languageJapaneseJapanese

mbstring.strict_detectionOffOff

mbstring.substitute_characterno valueno value

これって、つまりPHPの問題なんでしょうか?学が浅く申し訳ありません。


3 ● KeyKey
●26ポイント

テスト環境ではうまくいき、なお且つ日本語以外のSELECTはうまく結果が返ってくることから

やっぱり原因は文字コードだと考えるべきだと思います。

何も間違っているのはSELECT文の文字コードだけとは限りません。


一度以下のSELECTで全部出力してみて日本語の部分がきちんとUTF8で返ってくるのか確認してみてはどうでしょうか?

SELECT `Hoge`.`prefecture` FROM `hoges` AS `Hoge`;

もしかしたらMySQLがUTF8なのにEUC-JPなどでINSERTされていて復元不可能な文字化けを起こしているかもしれません。

SELECT時の文字コードが怪しいということはINSERT時の文字コードも疑ってかかったほうがいいと思います。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ