Mysqlの文字化け問題 - 文字コードを後から変更するのに手こずる

MySQLのDBは、デフォルトの状態だとlatin1という文字コードになっているようだ。
日本人で少しでもプログラムを触った事がある人なら、文字コードの問題はもう関わるのも嫌なはず。
私もそのくちで、MySQLに日本語文字列を突っ込むときは、全てUTF8にしていた。
しかし今になって気づいてしまった。
show status hogetblをしても、show create table hogetblをしても、出てくるのはlatin1の文字。
いまのところ問題は表面化していないが、いずれそのツケはどこかで回ってくるはず。
それならば今のうちにUTF8にしておけと。

まずは復習がてら、読んでおくべきなのは以下のサイト。


文字化け問題を本気で直す
http://wota.jp/ac/?date=20061011


my.cnfに以下のように追記。
/etc/my.cnf

[mysqld]
default-character-set=utf8
skip-character-set-client-handshake

[mysqld]に加え、 [mysql] にも書いておいた方が良いのかな。良く分からない。
この設定をしておけば、今後はデフォルトのcharsetがUTF8になる。
では、既にDBに大量のデータを突っ込んでしまった人はどうすればいいのか。


MySQL文字コード設定を後から変えるには
http://kzworks.at.webry.info/200903/article_14.html


このサイトや、他のサイトでもdumpに一旦書き出す手法を取っているが、dumpするのにもの凄い時間がかかるので、
ここではdumpせずに文字コードを変換しようと思う。

例えば、latin1(char50)で定義されたカラムに、latin1の文字コードで文字列が入っているレコードをutf8に変換するには以下のコマンドでできる。
ALTER TABLE hogetbl MODIFY column CHAR(50) CHARACTER SET utf8;


しかし、今の私の状況は、latin1で定義されたカラムに、UTF8の文字コードで文字列が入っているのだ。
これはやっかい。
この場合は、一旦バイナリに変換してから、再度UTF8に変換する必要があるそうだ。


以下のようにしてバイナリのデータ型に変換。バイナリならBLOBじゃなくてBINARY(50)とかでも良いけど、収まり切らない分のデータが消える可能性があるので注意。
私の場合、問題のカラムはTEXT型だったのでBLOBを使用しました。
ALTER TABLE hogetbl MODIFY column BLOB;

その後、改めてTEXT型にし、文字コードもUTF8に変換
ALTER TABLE hogetbl MODIFY column text CHARACTER SET utf8;

これでめでたくUTF8になりました。

参考:MySQLリファレンス - カラムキャラクタセット変換
http://dev.mysql.com/doc/refman/5.1/ja/charset-conversion.html