現在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
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_order no value no value
mbstring.encoding_translation On On
mbstring.func_overload 0 0
mbstring.http_input pass pass
mbstring.http_output pass pass
mbstring.internal_encoding EUC-JP EUC-JP
mbstring.language Japanese Japanese
mbstring.strict_detection Off Off
mbstring.substitute_character no value no value
テストサーバ
mbstring.detect_order auto auto
mbstring.encoding_translation Off Off
mbstring.func_overload 0 0
mbstring.http_input auto auto
mbstring.http_output pass pass
mbstring.internal_encoding UTF-8 UTF-8
mbstring.language Japanese Japanese
mbstring.strict_detection Off Off
mbstring.substitute_character no value no value
これって、つまりPHPの問題なんでしょうか?学が浅く申し訳ありません。
テスト環境ではうまくいき、なお且つ日本語以外のSELECTはうまく結果が返ってくることから
やっぱり原因は文字コードだと考えるべきだと思います。
何も間違っているのはSELECT文の文字コードだけとは限りません。
一度以下のSELECTで全部出力してみて日本語の部分がきちんとUTF8で返ってくるのか確認してみてはどうでしょうか?
SELECT `Hoge`.`prefecture` FROM `hoges` AS `Hoge`;
もしかしたらMySQLがUTF8なのにEUC-JPなどでINSERTされていて復元不可能な文字化けを起こしているかもしれません。
SELECT時の文字コードが怪しいということはINSERT時の文字コードも疑ってかかったほうがいいと思います。
回答ありがとうございます!
SET NAMES SJISを消してset character set sjisを入れてみたんですが、駄目でした。
また、両方同時に入れても同様でした。
これってMySQLのバージョンのせいなんでしょうか?