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
このような方法があることを知り、助かりました。ありがとうございます。
返信削除ちなみに、SET NAMES の抑制ですが、mysqldump で
--skip-set-charset
というオプションも付ければいいようです。私の場合、これで dump ファイルを文字化けさせずに無修正のまま無事インポートできました。
ちなみに create table での指定については、元々すべてのテーブルが utf8 であり、latin1 になっているものはありませんでした。