iRSSの日記

はてなダイアリーiRSSの日記の続き

mysqldumpをすると、文字化けする

サーバーの移行をしようと思い、mysqldumpを実行したら、文字化けてしまった。

mysqldump の仕様変更の弊害(文字化け) †

mysqldump は、3.X, 4.0 までは、コンパイルするときに指定されたキャラクターセットを標準としていました。
4.1 からは、mysqldump はコンパイル時のキャラクターセットを無視して、utf8 を標準とします。(ひどい。普通、mysqldump のキャラクターセットは、mysqlコマンドとかのキャラクターセットと同じだと思って使うよなぁ...)

これは、4.1 の文字コード自動変換機能と組合わさって、最低な状況を起こしてしまいます。

サーバーが ujis, sjis で動いていたとしても、utf8 に変換して dump します。
utf8 はご存じの通り、到底整理されているコードとは言い難く、そのため、dump した内容が壊れる可能性が高いです。

これを避けるためには、mysqldump を実行するとき、必ず default-character-set オプションを指定すべきです。

個人的には以下が好みです。

[mysqldump]
default-character-set=binary
skip-opt
create-options
set-charset
hex-blob
single-transaction
master-data

原因は、↑こちらで紹介されているとおり、DBで定義されている文字コードじゃなくて、utf8で作ろうとするかららしい。
default-character-set=binaryオプションで、そのまま取り出すことができるようになった。