WebOS Goodies

WebOS の未来を模索する、ゲームプログラマあがりの Web 開発者のブログ。

WebOS Goodies へようこそ! WebOS はインターネットの未来形。あらゆる Web サイトが繋がり、共有し、協力して創り上げる、ひとつの巨大な情報システムです。そこでは、あらゆる情報がネットワーク上に蓄積され、我々はいつでも、どこからでも、多彩なデバイスを使ってそれらにアクセスできます。 WebOS Goodies は、さまざまな情報提供やツール開発を通して、そんな世界の実現に少しでも貢献するべく活動していきます。
Subscribe       

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 に変更することにも挑戦してみたいと思います。それでは、今日はこのへんで。

関連記事

この記事にコメントする

Recommendations
Books
「Closure Library」の入門書です。
詳しくはこちらの記事をどうぞ!
Categories
Recent Articles