PHP-MySQL間での文字化けについて。
問題点
PHP、MySQLともにUTF-8で構成しているのに、DBとのデータ受け渡しで文字化けが起こる(おそらく他の文字コードでも同様)。
対応策
下記どちらかの対応を実施する。
その1
DB接続ごとに、処理実行前に「SET NAMES UTF8」というクエリを発行する。
その2
my.cnfファイルの設定を下記のように変更する。
#character-set-server = latin1 // 元々あるものをコメントアウト #collation-server = latin1_general_ci // 同 上 default-character-set=utf8 // 新しく追加する skip-character-set-client-handshake // 同 上
実行時の環境
- Windows 2000
- XAMPP 1.6.1
- PHP 5.2.1
- MySQL 5.0.37
- phpMyAdmin 2.10.02
詳細
上記のXAMPP環境で、PHP・MySQLともにUTF-8で構成しているはずなんだけど、どうも文字化けが出るのでいろいろ調べてみた。
ちょうど同じタイミングで同じような問題に遭遇していた方がいたようで、下記のサイトが参考になりました。
artful: XamppのphpMyAdminの文字化けーその2より。
PHP(文字コードはUTF8)とMySQL(phpMyAdminの照合順序はutf8_unicode_ci)のやり取りの際、PHPからそのままデータを挿入するとSQLから取り出した際は正常に表示されるのですが、phpMyAdmin内では日本語は文字化けしてました。
$sql = "SET NAMES utf8";
mysql_query($sql);そこで上記のUTF8で指定するコードをSQLから取り出す際も、挿入する際もはじめにSQLに送ることでphpMyAdmin内の文字化けも無事解決しました。
私の場合は、PHPMyAdminから挿入したデータをPHPスクリプトで取得すると文字化けするという反対の状況でしたが、同じ方法で解決できました。
ただ、この方法では接続のたびに毎回「SET NAMES」のクエリを発行しないといけないので、設定から変えられないものかと調べたら、MySQLのマニュアルに下記のような説明がありました。
MySQL AB :: MySQL 5.1 リファレンスマニュアル :: 4.4 接続のキャラクタセットおよび照合順序より。
デフォルト以外のキャラクタセットを使用したい場合、mysql クライアントでは、起動するたびに SET NAMESを実行する必要はありません。--default-character-setオプション設定をmysqlステートメントラインか、オプションファイルに追加することができます。たとえば、以下のオプション設定ファイルの設定では、mysql:を実行する度に、三つのキャラクタセット変数値をkoi8rに変更します。
[mysql]
default-character-set=koi8r
ところが、これを実際に(utf8に変更の上で)設定しても、変化がありませんでした。これはちょっと原因不明。
で、更に調べるうちに別のサイトを見つけて、これでやっと解決しました。
ヽ( ・∀・)ノくまくまー(2006-10-11) [MySQL] 文字化け問題を本気で直すより。
[mysqld]
default-character-set=utf8
skip-character-set-client-handshake1 行目でデフォルトの文字コードを指定し、2行目は「余計なことはするな」という命令。(MySQL4.1.5で実装)。これによってサーバとクライアントの文字コードが違っていても内部変換をしなくなる。余計なものを実装して、その余計なものを抑止するオプションを実装してくれたMySQLに乾杯!設定は上記のように "mysqld" セクションだけでOK。サーバの設定を変更したので、MySQLは忘れずに再起動しておく。
設定ファイルに元々記載されている「character-set-server = latin1」と「collation-server = latin1_general_ci」をコメントアウトして、代わりに上記2行を追加すると、めでたく「SET NAMES」なしでも文字化けを回避できました!
参考にしました上記2サイト様、ありがとうございました。
毎日コミュニケーションズ (2006/12)
売り上げランキング: 31520

「使える」逆引きが満載。
バージョン5.0の新機能も載っています


コメント (16)
このエントリに対するコメント:
ありがとうございます。
私も悩んでましたが、これで無事解決しました!
コメント日時: 2007年09月08日 06:33
助かりました。
この記事を参考にすることで、文字化けが消えました。
ありがとうございました。
コメント日時: 2008年03月17日 17:49
ありがとうございます。
サーバ移転した祭の文字化け、解決しました。
コメント日時: 2008年04月21日 10:56
めちゃくちゃ助かりました!!!!
コメント日時: 2008年07月28日 16:49
悩んでいた文字化けが解決しました!
ありがとうございました!
コメント日時: 2008年09月14日 02:01
今まで悩んでいたことが解決出来ました!
本当に有り難うございました
コメント日時: 2008年09月30日 02:20
ありがとうございました!
悩んでいた文字化け解消しました。
とても助かりました
コメント日時: 2008年12月05日 00:10
ありがとうございました!!
本当に悩んでいた文字化けが解決しました!!!
感謝です^^
コメント日時: 2008年12月14日 03:31
ありがとうございました!!
本当に悩んでいた文字化けが解決しました!!!
感謝です^^
コメント日時: 2008年12月14日 03:31
今、プログラムでMySQLサーバーに日本語データを挿入し、phpMyAdminで挿入したデータを表示しますと、同じように文字化けが起こってしまい、こちらのサイトの解決方法で直りました。
一番最後の解決方法で直りました。
本当にありがとうございました!
助かりました!
コメント日時: 2008年12月20日 17:26
毎回実行する SET NAMES クライアント文字コード;
が嫌で仕方ありませんでした。
とても助かりました。
ありがとうございます。
コメント日時: 2009年03月13日 12:13
本気で感謝してます、
『mysql_query("SET NAMES utf8");』
と一行で解決してくれた、めでたくめでたく、
ありがとう~~~!
コメント日時: 2009年05月02日 11:25
すばらしいです。
本当に解決しました。
ありがとうございました。
コメント日時: 2009年07月13日 15:59
このHPのおかげで一日悩んでいたものが解決して本当に嬉しい限りです。
本当にありがとうございました!!
コメント日時: 2009年10月05日 16:47
ありがとうございました。
コメント日時: 2009年10月12日 13:50
ありがとうございました!
助かりました!
コメント日時: 2010年03月04日 03:31