文字コードの違う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
でdumpvim -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