dポイントプレゼントキャンペーン実施中!

いつもお世話になっています。
今回、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で呼び出した時に文字化けするのでしょうか?

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

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

この回答への補足

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

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

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


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

補足日時:2007/11/07 00:14
    • good
    • 0
この回答へのお礼

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

#1です


例えばSJISなら、
mysql_query("set names SJIS");
のような形でSELECTなどのクエリを発行する前に書きます。
    • good
    • 0
この回答へのお礼

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

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-c …

参考まで。
    • good
    • 0
この回答へのお礼

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

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


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

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

お礼日時:2007/11/06 20:39

sjisで使用する際にphp.iniは


output_handler = mb_output_handler
が必要だった気がします。
こちらもあわせて確認してみては。
    • good
    • 0
この回答へのお礼

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

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

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

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

お礼日時:2007/11/06 20:42

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!