Perlを中心とした技術系の話などをつらつら

2006年12月05日

mysqldumpで文字化けしないためのメモ

ローカルの開発環境で使っていたMySQLなんですが、何も考えずデフォルトの設定で使っていたら、mysqldumpした際に、データが文字化けして、ちょっとは待ったのでメモ。

MySQLのバージョンは4.1.20。

文字化けする原因は、mysqldumpがデフォルトでは、文字コードをUTF-8で出力するようになっていて、フィールドの型がUTF-8でない場合は、自動でUTF-8に変換するためのようです。

僕が使っていたDBは文字コードについて特に何も設定していなかったので、デフォルトの文字コードであるlatin1になっていました。

なので、これもmysqldumpするとlain1 -> UTF-8な変換が自動で行われ文字化けしたということのようです。納得。

この自動変換を行わないようにすれば解決するはず。ということで調べてみると、--default-character-setというオプションを使うとよいことがわかりました。これを使ってデフォルトの文字コードをDBの文字コードとあわせてやることで、自動変換が行われなくなり、文字化けしないようです。

で、結局以下のコマンドで文字化けせずdumpすることができました。

mysqldump --default-character-set=latin1 -uroot --all-databses > db.dump

これでデータ自体は文字化けしなくなりますが、これをそのまま、UTF-8なDBに取り込むと、取り込んだデータが文字化けしてしました。

ダンプしたデータを見てみると、所々にSET NAMES latin1とかDEFAULT CHARSET=latin1のように「latin1]の文字が。。

これが原因だったようで、ワンライナーでlatin1をutf8に変更してからインポートしたところ、文字化けせずに取り込むことができました。

perl -pi -e 's/latin1/utf8/' db.dump

Technorati TAGTechnorati TAG , ,

Posted by horiuchi at 2006年12月05日 11:07

Continuing the discussion...

このエントリーのトラックバックURL:
http://hori-uchi.com/mt/trackback/452

Comments

こんにちは。
大変ご無沙汰しております。

mysqldumpで--default-character-setを指定するまでは分かっていたのですが、create tableでの文字コード指定までは気づきませんでした。
これでようやく文字コードの心配もなくなりました。
どうもありがとうございます。

Posted by komchiro at 2007年12月21日 16:48

Post a comment




Remember personal info?