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

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
(このエントリへの言及リンクのないトラックバックは反映されません)


このエントリに対するトラックバック:

» MySQLの文字コード問題(送信元: 驢馬の耳)
EC CUBEを実験的にxamppに導入しいろいろ試していた所、 どうもデータベース内(phpmyadmin)での表示が文字化けを起こすので 参考書等を参... [詳しくはこちら]

» タグクラウドがうまく表示されない -- 解決に向けて(送信元: 颯颯爽爽)
 sakuraレンタルサーバーを使用してMySQLをつかっています。 今回の文字... [詳しくはこちら]

コメント (12)

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

» igucci:

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

» miracle_link_manager:

助かりました。

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

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

» fuji:

ありがとうございます。

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

» phenom:

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

» sayumi:

悩んでいた文字化けが解決しました!
ありがとうございました!

» s0721h:

今まで悩んでいたことが解決出来ました!
本当に有り難うございました

» Ray:

ありがとうございました!
悩んでいた文字化け解消しました。
とても助かりました

» IPL:

ありがとうございました!!
本当に悩んでいた文字化けが解決しました!!!
 
感謝です^^

» IPL:

ありがとうございました!!
本当に悩んでいた文字化けが解決しました!!!
 
感謝です^^

» maru:

今、プログラムでMySQLサーバーに日本語データを挿入し、phpMyAdminで挿入したデータを表示しますと、同じように文字化けが起こってしまい、こちらのサイトの解決方法で直りました。
一番最後の解決方法で直りました。

本当にありがとうございました!
助かりました!

» 青野跳馬:

毎回実行する SET NAMES クライアント文字コード;
が嫌で仕方ありませんでした。

とても助かりました。
ありがとうございます。

» みぎこ:

本気で感謝してます、
『mysql_query("SET NAMES utf8");』
と一行で解決してくれた、めでたくめでたく、
ありがとう~~~!

コメントを投稿

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

プロフィール

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

連絡先:
inamenai [at] gmail.com

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

フィード

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

最新のTumblr

ライセンス

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

その他

track feed
  • track word