EUCからUTF-8で文字化け解消方法

自宅サーバーを構築した頃はサーバーもクライアントも文字コードをeucにしていたが、CentOS4以降、標準文字コードがutf-8になった。特にSSHなどでサーバーにリモート接続して操作する場合にはサーバーとクライアントの文字コードが違うと文字化けが発生してしまう。また、MySQLを使ったブログなどは文字コードが違うと後で直すのは更に厄介だ。今までは文字化けしないように騙し騙しやってきてたが、今回、サーバーをCentOSの64bit版、utf-8で再構築したので、昔からのMySQLのデータもすべてをutf-8で統一することにした。どうすればいいのかネットで調べてもなかなか有力な情報が得られなかったが、下記の方法でなんとかutf-8に統一することが出来た。
まず、phpmyadminで確認すると、データベースはeucjpms_japanese_ci、各テーブルはlatin1_swedish_ciになっている。テーブルの中身もしっかり文字化けしている。
20121103-latin_1
当然この状態でテーブルの照合順序をutf-8にしても、データベース全体をutf-8にしても文字化けは解消されない。また、mysqldumpでエクスポートしたものも、文字化けしているテーブルと文字化けしていないテーブルがある。なので、各テーブルごとにmysqldumpでエクスポート、各テーブルごとに文字化けを修正し文字コードをutf-8にして保存。直した各テーブルをmysqlでインポートすることでほぼ文字化けが解消した。
手順は下記の通り
phpmyadminでデータベースのテーブルを確認し全テーブルをbackupフォルダにエクスポート。mysqlのrootパスワード(********) データベース名(centos) テーブル名(nucleus_item) 保存フォルダ場所(backup)の場合

[root@server1 ~]# mysqldump -uroot -p******** centos nucleus_item --default-character-set=binary > /backup/nucleus_item.sql

mysqldumpでエクスポートしたそれぞれのテーブルのデータをテキストエディタで開き、latin1になってたところをutf8に修正、文字化けしてないか確認し、文字化けしてるようであれば文字化けが解消する文字コードで一旦読み込み、文字化けを直してから文字コードをutf-8nに指定して保存。文字化けしてなければそのまま文字コードをutf-8nに指定して保存。
20121103-utf-n8
修正が終わったらそれぞれのテーブルをmysqlコマンドでインポート。

[root@server1 ~]# mysql -uroot -p******** centos --default-character-set=binary < /backup/nucleus_item.sql

mysqlでインポートする際、幾つかのテーブルがエラーになったが、どうもデータ容量が大きいためらしい。デフォルトの最大サイズは1Mらしいので、大きいデータでもインポート出来るように16Mに変更。
/etc/my.cnfを修正。

[root@server1 ~]# vi /etc/my.cnf
[mysqld]
max_allowed_packet=16M ← 追加

最後に、phpmyadminでデータベースの照合順序をeucjpms_japanese_ciからutf8_general_ciに変更。あとはNucleusのグローバル設定の使用する言語をjapanese-eucからjapanese-utf8に変更。設定画面上のサイト名が文字化けしてたが手入力で修正。これでサーバーとクライアントの文字コードがutf-8で統一され文字化けが解消した。
20121103-utf8
Thumbnailデータはどの文字コードで読み込んでもことごとく文字化けしてて修正不能だった為、一旦データそのものをMySQLから削除して作業続行。
20121103-thumbnail
Thumbnailプラグインもバージョンが上がってたので新しいものをインストール。テーブルを作りなおすことで文字化けが解消した。