- ベストアンサー
MySQLから送られて来たデータの文字化け
いつもお世話になっています。 今回、phpでmysqlに接続したのですが、mysqlから引っ張ってきたデータが文字化けして困っています。(日本語のみ文字化け) 使っている環境は以下の通りです。 IIS6.0 PHP 5.0.4 MySQL 4.1.22 IISは、CGI、ASP、ISAPIを許可にしています。(.phpを見れるようになっています。) php.iniのmbstringの設定は以下のようになっています。 1105 mbstring.language=Japanes 1110 mbstring.internal_encoding = EUC-JP 1113 mbstring.http_input = auto 1117 mbstring.http_output = SJIS 1124 mbstring.encofing__translation = On 1128 mbstring.detect_order = auto 1132 mbstring.substitute_charecter = auto 1133 mbstring.script_encoding = EUC-JP my.iniの設定は以下のようになっています。 [mysql] default-character-set=sjis [mysqld] default-character-set=sjis skip-character-set-client-handshake mysqlでコマンドで確認したところ以下のような文字設定になっています。 mysql> show variables like "char%"; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | sjis | | character_set_connection | sjis | | character_set_database | sjis | | character_set_results | sjis | | character_set_server | sjis | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ character_set_systemがutf-8になっているのが気がかりですが、 こんな感じで設定しています。 mysql内では文字化けしていないのに、 phpで呼び出した時に文字化けするのでしょうか? どなたかご教授よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
度々どうも(笑。まだはまってますか。 mysql云々以前に、表示させているスクリプトの文字コードは統一されていますか? PHPファイルがSJISで作成されていて、内部文字エンコードがEUC-JPで、MySQLから引っ張ってきたデータがUTF-8で、というような事ではわけ分かんなくなります。 内部文字エンコードはSJISならばファイルもSJISで作成していかないとまずいですよね。 また、MySQLに格納されているデータはどんな文字コードで保存されているのですか?MySQLの文字コードがUTF-8にも関わらず、保存されているデータがSJISであれば、set names sjisとやってもSJISをSJISに再変換しようとするのでおかしな事になってしまいます。 MySQLに格納されているデータがおかしいなら、文字コードの罠にはまったまま抜け出せないと思います。 PHPからの送信文字コード、MySQLサーバへの記録文字コード、MySQLサーバからの出力文字コード、PHPでの出力文字コード等をしっかり整理していけば必ず文字化けは解決します。php.iniでの設定で直る事もあるかもしれませんが、経験上は環境設定だけではなかなか直らないという印象です。一つ一つ整理して問題を切り分け、文字コードを確認しながら詰めていけば大丈夫です。
その他の回答 (3)
- taketan_mydns_jp
- ベストアンサー率58% (450/773)
#1です 例えばSJISなら、 mysql_query("set names SJIS"); のような形でSELECTなどのクエリを発行する前に書きます。
お礼
taketanさん またまたお早い回答ありがとうございます。 今やって見ました。 mysql_query("set names sjis"); mysql_query("set names utf8"); mysql_query("set names EUC-JP"); 上記の三通りを試して見ましたが、 utf8にした時、日本語じゃないですが、文字化け具合が変わりました。 又、 mysql_query("set names 'character_set_name'"); ともやってみましたが、、 以前状況は変わりません。 参考までに、今の文字化けの例として、 「お好み焼き」が「DQ」と表示されます。 お手数をおかけしてすいません。。。。
- taketan_mydns_jp
- ベストアンサー率58% (450/773)
MySQLは4.1より前か後かで日本語の取扱いが違ってきます。 4.1以降は文字コードはクライアントにあわせて設定可能になっています。 SET NAMES character_set_name SET CHARACTER SET character_set_name 接続時に、上のようなクエリを発行して下さい。DB内のデータがどういうエンコードであっても、クライアント側へのデータは設定した文字コードで取得出来ます(逆に、設定しないと文字化けする)。 http://dev.mysql.com/doc/refman/4.1/ja/charset-connection.html 参考まで。
お礼
taketanさん 早速の回答感謝します。 返事が遅れてすいません。 上記のようなクリエは、phpの中のどこに付ければいいのでしょうか? 例 $sql=mysql_query("set names character_set_name"); こんな感じでmysql内に記述するように書けばいいのでしょうか? 初歩的な質問で申し訳ありません。。
- wp_
- ベストアンサー率54% (132/242)
sjisで使用する際にphp.iniは output_handler = mb_output_handler が必要だった気がします。 こちらもあわせて確認してみては。
お礼
wp_さん 早速の回答ありがとうございます。 すいません私の書きもれでした。 今、自分のphp.iniを確認しましたところ、 output_handler = mb_output_handler になっていました。 また、何かあったら回答していただければ幸いです。
お礼
※事後報告です。 昨日は大変お世話になりました。 taketanさん&wp_さんから貴重な情報を頂き 本当にありがとうございます。。 mysaqlの文字化けが直りましたので、 ここに報告させていただきます。 結論としては、mysql内の問題では無く、 php.iniのmbstringの問題でした、 今までは、 mbstring.internal_encoding = EUC-JP mbstring.script_encoding= EUC-JP になっていました。 これは、スクリプトファイルをsjisにすると、 文字化け出る場合があると書いてあったので、 意図的にEUC-JPに変えたものでしたが、 今回、mysql内の設定がsjisで統一されていたため、 phpファイルをEUC-JPで作っているのに、sjisでブラウザーに 出していたため、このような文字化けが出たと 推測しています。 なので、上記のEUC-JPをSJISに変えたら文字化けが 解消されました。 taketanさんの昨日の最後の回答がヒントになり、 大変助かりました。 また何かありましたら、是非、 ご教授ください。 本当にありがとうございました。 se-nabe
補足
takectanさん本当にありがとうございました。 完全に文字化け無限ループに嵌っていますTT 今日はもう8時間位文字化けと戦っているので、 また明日mysql内の文字コードから戦いを続けたいと思います。 また、何かありましたら、是非ご教授下さい。 明日中に直っても直らなくても、ここに結果を報告させていただきます。 遅い時間まで本当にありがとうございました。