MySQLのデータベース移行 latin1からutf8へ

こないだいくつかのサービスやブログのデータベース移行を行った。
DBMSはおなじみMySQL。

移行と行っても停止して全然問題のないデータベースなので単純にmysqldumpして流し込むだけなのでお手軽簡単。
ただ移行前のMySQLは文字コードが完全バカ設定だったが、移行後のMySQLは真面目状態に設定した状態になっているので、文字コードにちょっと気を遣ってやる必要がある。

移行前のデータ

移行前のMySQLには入っているデータに二つのケースがある。

  • テーブルの文字コードがlatin1でUTF-8のデータが入っているケース
  • テーブルの文字コードがUTF-8でUTF-8のデータが入っているケース

後者の場合は何も考えずダンプしたデータをそのまま流し込めばいいので苦労はないが、前者の場合は次の手順でダンプ内容をちょっと書き換える。

latin1からutf8へ

まずダンプする。
そのまま手を加えず取り出すためlatin1で。

 $ mysqldump -u hogeuser -p --default-character-set=latin1 hogedb > hogedb.dump

ダンプされたデータ内容はUTF-8だが、データベースやテーブルの文字コードがlatin1なのでこれを真面目MySQLに読ませると文字化ける。
そこで「latin1」を「utf8」に書き換える

ここでsedとか使いこなせるとかっこいいのかもしれないがぐぐらないと使い方が思い出せないのでファイルもそんなに大きくなかったしviで開いて置き換えてしまった。
でもダンプファイルが大きい場合はしんどいと思われるので一応ぐーぐる先生に聞いたやり方を参考までにメモっておく。

sed -e s/latin1/utf8/ hogedb.dump > hogedb_utf8.dump

文字コード指定以外に「latin1」という文字列があった場合はそれも巻き込んで変換してしまうので、そういう場合は適当に工夫していただきたい。

参考

ヽ( ・∀・)ノくまくまー(2006-10-11) [MySQL] 文字化け問題を本気で直す

「赤の MySQL さん、ここは “utf8” になって頂きたかった。(児玉清)」のフレーズがいまだに心に響く。

前の記事

Railsの逆引きリファレンス本

次の記事

Mercurialの勉強会に参加してきた