MySQL の文字化けへの対処方法
昨日 emerge sync してパッケージをアップデートしたところ、Sitebar のリンク文字列が化けるようになってしまいました。そういえば MySQL が更新リストに入っていたなぁ・・・。orz
そんなわけで、泣く泣く MySQL の文字化け対策について調べてみました。もし同様にWebアプリケーションが文字化けするようになった方がおられましたら、参考にしてください。
原因
どうやら MySQL は 4.1 になってからクライアントのキャラクターセットに応じて文字コード変換をするようになったようです。それ自体はけっこう前の話なのですが、これまで GentooLinux ではデフォルトの文字コードに "latin1" が設定されていました。おそらくそれはいかがなものかという議論があったのでしょう。結果、今回の更新で "utf8" に変更されてしまったわけです(TДT;
実際に表示される文字の化け方からすると、データベース内にある実際には UTF-8 の文字列が latin1 -> UTF-8 変換されてしまっているのだと思います。たぶん、テーブル作成時のデフォルト文字コードが latin1 だったために、格納されている文字列が latin1 として扱われているんでしょうね。
対策
さて、それではどうするかという話ですが、最終的にはデータベースをいったんダンプして、UTF-8 のテーブルとして登録しなおすのが理想でしょう。しかし、差し当たりそんな暇はないので、設定でなんとか逃げる方法を調べてみました。
default-character-set を latin1 に戻す
一番安直な方法です(^^;。設定を元に戻せばおそらく何事もなく動作するでしょう。しかし、これでは今後作成するテーブルもすべて latin1 になってしまい、後で UTF-8 に戻す手間がより膨らんでしまいます。
一応、設定をご紹介しておくと、"/etc/mysql/my.cnf" を以下のように変更すれば OK です。
[mysqld] character-set-server = latin1 default-character-set = latin1
設定したら、MySQL を再起動してください。
/etc/init.d/mysql restart
その他、"[mysql]" などのセクションにも同じ設定がありますので、すべて "latin1" に変更したほうが無難だと思います。
init-connect='SET NAMES binary' を使う
MySQL で指定できる文字コードのひとつに、"binary" というものがあります。これを指定してやると、相手の文字コードが何であれ格納されているデータがそのまま出力されます。クライアント側の文字コードを強制的に "binary" に設定できれば、とりあえず急場はしのげそうです。
具体的には、"/etc/mysql/my.cnf" に以下の設定をしてやります。
[mysqld] init-connect='SET NAMES binary'
設定したら、やはり MySQL を再起動します。
/etc/init.d/mysql restart
これでも正常な表示に戻せました。新しくテーブルを作った際の文字コードがどうなるのかは確認していませんが、少なくとも "latin1" よりはマシでしょう(^^;
以上、とりあえず応急処置ですが、正常な表示に戻すことができました。折を見てデータベース自体を UTF-8 に変更することにも挑戦してみたいと思います。それでは、今日はこのへんで。
詳しくはこちらの記事をどうぞ!
この記事にコメントする