• ベストアンサー

MySQLとPHPで日本語が文字化けする。

MySQLとPHPでアプリを開発中です。 MySQLに登録済の日本語文字列データをPHPでselectして echoを使ってクライアント(Windows XP)のブラウザに表示させると、 文字化けします。 全角文字がすべて半角の '?' になります。 MySQLの状態を調べるために以下を実行しました。 SHOW VARIABLES LIKE 'char%'; 結果は以下のとおりでした。 character_set_client utf8 character_set_connection utf8 character_set_database utf8 character_set_filesystem  binary character_set_results utf8 character_set_server utf8 character_set_system utf8 character_sets_dir /usr/local/mysql5.0.51a/share/mysql/charsets/ PHPの内部エンコードはUTF-8です。 php.iniの関連設定は以下のとおりです。 default_charset = "UTF-8" mbstring.language = Japanese mbstring.internal_encoding = UTF-8 mbstring.http_input = auto mbstring.http_output = UTF-8 mbstring.detect_order = SJIS,EUC-JP,JIS,UTF-8,ASCII mbstring.substitute_character = "none" mbstring.encoding_translation = On extension_dir = "/usr/local/lib/php/extensions" extension=php_mysqli.dll extension = gd.so extension = mysqli.so extension = xmlrpc.so MySQLもPHPもすべてUTF-8で統一したので問題ないはずだと 思ったのですが? 半角アルファベットは問題なく表示されます。 サーバー側OSはSolarisです。 MySQLから正しくデータを得られていないように思えるのですが。 ヒントでも結構ですから教えていただけるとありがたいです。 よろしくお願いします。

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

  • ベストアンサー
noname#243182
noname#243182
回答No.3

もしデータベース接続に MySQLi をご利用であれば、諸々のクエリを発行する前にデータベース接続の現在の文字コードセットを確認してください。 http://jp.php.net/manual/ja/mysqli.character-set-name.php 標準的な環境であれば、返される文字列は latin1 となっているはずです。 次にやるべきことは文字コードセットの指定です。 http://jp.php.net/manual/ja/mysqli.set-charset.php 希望する文字コードセットにてデータベース接続が準備できましたので、目的のクエリを発行し、データを取得してください。 また、このような手順がわずらわしいと感じる場合、接続のオブジェクトを生成する前に各種設定を施すことが出来ます。 http://jp.php.net/manual/ja/mysqli.options.php my.cnf に代わってアプリケーション用に準備した設定ファイルを読み込ませ、ここに予め接続の文字コードセットを指定しておくのが便利です。 例えば .my.cnf という設定ファイルを作成し、この中に [PHP] セクションを準備すると分かりやすいかもしれません。

参考URL:
http://jp.php.net/manual/ja/book.mysqli.php
youzan1231
質問者

お礼

ありがとうございます。 ご指摘のとおりに文字コードセット関数を呼び出して設定したところ、 完全にうまくいきました。 あまりにもあっけなく解決したので、 自分の無知が恥ずかしくなりました。 改めて御礼申し上げます。 本当に助かりました。

その他の回答 (3)

  • BellBell
  • ベストアンサー率54% (327/598)
回答No.4

データベース接続直後に、クライアント(PHPプログラム)から送信される文字コードをセットする必要があるのかも知れません。 DB設定直後に一度設定することで有効なので、接続したら必ず実行されるようにDB接続を関数化してそこに書き込んでおくのも有効かも知れません。 $db->query("SET NAMES utf8");

youzan1231
質問者

お礼

ご協力をありがとうございます。 この問題は解決しました。 samchayさんの回答をご参照ください。

  • mimzy
  • ベストアンサー率33% (32/96)
回答No.2

my.cnfの[mysqld]というセクションを探して下記を追記してください。 skip-character-set-client-handshake mysqlの再起動、お忘れなく。

youzan1231
質問者

お礼

ご協力をありがとうございます。 この問題は解決しました。 samchayさんの回答をご参照ください。

youzan1231
質問者

補足

利用しているレンタルサーバー業者に問い合わせたところ MySQLへの環境設定変更はできないと言われました。 こちら側(ユーザー側)からMySQLをモディファイすることは 規則でできないそうです。 利用しているレンタルサーバーは、共用サーバーです。 また、他のユーザーさんからその苦情はきていないそうです。 他の手段はないでしょうか?

noname#111181
noname#111181
回答No.1

FORMで受け取ったテキストをコード変換せずにMySQLに格納しているということはありませんか? MySQL格納と取り出しの部分の個^度を教えていただけないでしょうか。

youzan1231
質問者

お礼

ご協力をありがとうございます。 この問題は解決しました。 samchayさんの回答をご参照ください。

youzan1231
質問者

補足

今はテストの段階で、MySQLへのデータ格納はphpMyAdminを使って 手入力で格納したものです。 取り出しの部分のコードは以下のとおりです。 $query2= "SELECT * FROM members_tbl WHERE delete_flg = 0 AND member_id =".$member_id." ;" ; $res2= $db->query($query2); if ($res2 == FALSE){   $msg = "DB query2 failure" ;   break ; }else{   $row_cnt2= $res2->num_rows ;   if ($row_cnt2 == 0){ $msg = "no handle_name is found" ;   }else if ($row_cnt2 == 1){ $row2 = $res2->fetch_array() ; $handlename = $row2['handle_name'] ;   } echo ",".$handlename ; 上記のコードで、$handlenameには例えば"ひろし"のような全角文字列が 格納されるはずなのですが、"???"のようになってます。 半角アルファベットの場合には問題なく正しく格納されています。 ちなみに利用しているレンタルサーバー業者に問い合わせたところ MySQLへの環境設定変更はできないそうです。 他のユーザーからその種の苦情もきていないそうです。 よろしくお願いします。 

関連するQ&A