« ニコニコ動画のカテゴリタグ | メイン | ドメイン名・サイト名の由来 »

MySQLの文字化け対策

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-handshake

1 行目でデフォルトの文字コードを指定し、2行目は「余計なことはするな」という命令。(MySQL4.1.5で実装)。これによってサーバとクライアントの文字コードが違っていても内部変換をしなくなる。余計なものを実装して、その余計なものを抑止するオプションを実装してくれたMySQLに乾杯!設定は上記のように "mysqld" セクションだけでOK。サーバの設定を変更したので、MySQLは忘れずに再起動しておく。

設定ファイルに元々記載されている「character-set-server = latin1」と「collation-server = latin1_general_ci」をコメントアウトして、代わりに上記2行を追加すると、めでたく「SET NAMES」なしでも文字化けを回避できました!

参考にしました上記2サイト様、ありがとうございました。

MySQL逆引きクイックリファレンス―MySQL 4.0/4.1/5.0対応
山田 祥寛
毎日コミュニケーションズ (2006/12)
売り上げランキング: 31520
おすすめ度の平均: 5.0
5 「使える」逆引きが満載。
5 バージョン5.0の新機能も載っています

トラックバック

このエントリのトラックバックURL:
http://inasphere.net/mt/mt-tb.cgi/27
(このエントリへの言及リンクのないトラックバックは反映されません)


コメント (4)

このエントリに対するコメント:

» igucci:

ありがとうございます。
私も悩んでましたが、これで無事解決しました!

» miracle_link_manager:

助かりました。

この記事を参考にすることで、文字化けが消えました。

ありがとうございました。

» fuji:

ありがとうございます。

サーバ移転した祭の文字化け、解決しました。

» phenom:

めちゃくちゃ助かりました!!!!

コメントを投稿

(本文に日本語を含まないコメントは反映されません)

プロフィール

運営者:ina
詳細はプロフィール参照。

連絡先:
inamenai [at] gmail.com

現在このブログは更新停滞中です。はてなダイアリーの方へどうぞ。
Loading...

フィード

最新のはてなブックマーク

最新のTumblr

ライセンス

クリエイティブ・コモンズ・ライセンス
このブログは、上記のクリエイティブ・コモンズ・ライセンスで保護されています。

その他

track feed
  • track word