文字コードの違うDBの移行(latin1からUTF8へ)

怒濤のDB移行シリーズ

前提

  • 移行もとはゴリゴリのlatin1
  • 移行先はUTF-8
mysql> show variables like 'collation%';
+----------------------+-------------------+
| Variable_name        | Value             |
+----------------------+-------------------+
| collation_connection | latin1_swedish_ci |
| collation_database   | latin1_swedish_ci |
| collation_server     | latin1_swedish_ci |
+----------------------+-------------------+
3 rows in set (0.00 sec)

mysql> show variables like 'char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | latin1                     |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

dumpしてみる:character-setだけでいけたらいいよね編

  • `default-character-set=latin1`でdump
  • `vim -c “e ++enc=latin1″`で開いて`SET NAMES utf8`追加
vim --cmd "set encoding=latin1" 20140520.sql

リストアしたけど文字化けしたままだった。

dumpしてみる:nkfで文字コード変えてみようね編

  • `default-character-set=latin1`でdump
  • nkfでutf8に
  • sedでlatin1という表記をすべてutf8に変換(もしくはVimで`:%s/[置換対象文字列/[置換文字列]/cg`でもよい)
sed -e 's/latin1/utf8/g' 20140520.sql > 20140520_utf8.sql

リストアしてみたら、vimで読めるようになったけどリストア時にエラーが出る

dumpしてみる:正解編

移行先はUTF8、移行元はlatin1だったけどサイトがEUC-JPで動いているサイトだったので、latin1のDBにEUC-JPのデータを保存しているという厄介きわまりない仕様だった。
DB移行の際にはどうやって保存されたデータなのかを確かめるべきである。
そもそもなんなのよlatin1て!と思いたくなるが、DBがlatin1だったというケースは往々にして遭遇してしまうものなので、今後もラテンのノリとはうまく付き合って行きたい。

  • `default-character-set=latin1`でdump
  • vimで内部のlatin1表記を全部ujisに変換
  • mysql内にujisでdatabase作成`create database fp2 default character set ujis`
  • ujis指定でインポート`–default-character-set=ujis`をつける

おまけ

移行したデータをCSVデータで吐き出したので、csvfile_sjisというディレクトリに全部保存して、Excelで開けるようにsjisの形式に変換してあげる

find csvfile_sjis/ -type f -print0 | xargs -0 nkf --overwrite -s