こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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で呼び出した時に文字化けするのでしょうか?

どなたかご教授よろしくお願いします。

投稿日時 - 2007-11-06 15:39:07

QNo.3494337

すぐに回答ほしいです

質問者が選んだベストアンサー

度々どうも(笑。まだはまってますか。

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での設定で直る事もあるかもしれませんが、経験上は環境設定だけではなかなか直らないという印象です。一つ一つ整理して問題を切り分け、文字コードを確認しながら詰めていけば大丈夫です。

投稿日時 - 2007-11-06 23:38:33

補足

takectanさん本当にありがとうございました。

完全に文字化け無限ループに嵌っていますTT

今日はもう8時間位文字化けと戦っているので、
また明日mysql内の文字コードから戦いを続けたいと思います。


また、何かありましたら、是非ご教授下さい。
明日中に直っても直らなくても、ここに結果を報告させていただきます。
遅い時間まで本当にありがとうございました。

投稿日時 - 2007-11-07 00:14:14

お礼

※事後報告です。
昨日は大変お世話になりました。
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

投稿日時 - 2007-11-07 13:47:31

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(4)

#1です
例えばSJISなら、
mysql_query("set names SJIS");
のような形でSELECTなどのクエリを発行する前に書きます。

投稿日時 - 2007-11-06 22:03:35

お礼

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」と表示されます。

お手数をおかけしてすいません。。。。

投稿日時 - 2007-11-06 22:19:51

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

参考まで。

投稿日時 - 2007-11-06 16:17:45

お礼

taketanさん
早速の回答感謝します。
返事が遅れてすいません。

上記のようなクリエは、phpの中のどこに付ければいいのでしょうか?


$sql=mysql_query("set names character_set_name");

こんな感じでmysql内に記述するように書けばいいのでしょうか?
初歩的な質問で申し訳ありません。。

投稿日時 - 2007-11-06 20:39:15

ANo.1

wp_

sjisで使用する際にphp.iniは
output_handler = mb_output_handler
が必要だった気がします。
こちらもあわせて確認してみては。

投稿日時 - 2007-11-06 16:00:56

お礼

wp_さん
早速の回答ありがとうございます。

すいません私の書きもれでした。
今、自分のphp.iniを確認しましたところ、

output_handler = mb_output_handler
になっていました。

また、何かあったら回答していただければ幸いです。

投稿日時 - 2007-11-06 20:42:53

あなたにオススメの質問