mysqlのダンプファイルで濁点だけ文字化けする

cronとmysqldumpを使って定期的にバックアップしていたsqlファイルが文字化けしていました。システムを他の環境に移す必要がでてきたので、リストアのためにダンプファイルを見ていた時に気づきました。使っていたコマンドは下記のような感じ。

mysqldump -u user -p****** --opt --single-transaction --master-data=2 --flush-logs --all-database > /tmp/test.sql

基本的に使用しているデータベースの文字コードはutf8で、mysqldumpもデフォルトでutf8で出力となる。念のためにmy.cnfにも[mysqldump]セクションを作り、default-character-set = utf8を指定してある。オプションをいくつかつけているけど、基本的なものだと思うので気になる人は別に調べてください。


文字化けしていたのですが具体的な現象としては、全角の濁点が文字化けしています。もう少し詳しく説明すると文字化けはほとんどしてなくて一部のテーブルの一部のデータのみ、全角の濁点部分にカーソル位置みたいな長方形の四角が2つつきます。「が」→「か■■」「で」→「て■■」うまくその資格に変換できないので大きな四角になってしまいましたが、こういう感じです。ただ同じテーブルでもちゃんと「が」と出力できているところもあって謎です。僕が普段テキストエディタで使っているxyzzyではutf8として自動解釈されてファイルは開きました。
ダンプしたデータでは文字化けしていますが、システムでは文字化けは見られません。システムではわかりにくいのでphpmyadmin上では化けませんと言った方がいいかもしれません。またシステムでエクセルなどの出力・印刷することもあるのですが、お客さんから苦情が来ないところを見ると問題は起こっていないと思われます。
mysqldumpのコマンドがどこか悪いのかとオプションを変更したり、phpmyadminからのエクスポートも試しましたが同じ文字化けを起こします。システムでは問題がないということから、新しい環境のmysqlにインポートしてしまえば意外と普通に動くのではないかと期待してインポートしてみました。「が」→「か??」「で」→「て??」という文字化けでインポートされました。厳密には文字化けしたファイルを正規のutf8のファイルとしてインポートしているので??になったのは文字化けじゃないと思います。結局使えないことがわかりました。
文字化けとはいえ、ほとんど文章は読める状態ですし、文字化けの規則性も濁点が四角になるだけなので手動でちまちまと直すことはできます。phpmyadminのレコード編集をすると「が」の文字をバックスペースで削除して、再度「が」と打ち直すことになります。この時に「が」で1回のバックスペースで削除できると思いきや、1回では濁点が削除され「か」になりました。2回押さないと削除できない。おかしな話です。
文字化けしたダンプファイルの文章をコピペしても当然化けたまま。メモ帳にコピペすると文字化けしないです。これを保存してからメモ帳の文章をコピーして、phpmyadminで入力すると文字化けしません。phpmyadmin上でもシステム上でも正常に表示される。うまく文字化けが直せたと思いきや、エクスポートしてみるとまた同じように濁点が文字化けしました。システムとしての復旧だけならなんとか用が足りていますが、バックアップが壊れているというのは不安なもので根本的に解決している感じがしません。
他にはsubstringなどのmysql関数でsubstring('か??','が')と置き換えても直すことができると思います。UPDATE文とWHERE句とsubstringを駆使すればぎりぎりできるか?レコード数やカラム数次第かもしれません。プログラムが使える人は素直に読み込ませて置き換えるといいのかもしれません。


結局、僕の場合は手動でなんとかなる範囲で修正したのですが、一応原因を調べました。濁点が文字化けするというところから検索するとmac絡みでの現象がいくつかありました。僕のメインマシンはwindows8でこれをリモート端末にして、サーバであるCentOSに接続しています。今回文字化けした部分は会社の人から頼まれた部分を入力したものでした。その会社の人はmacをメインで使っているので、この辺りが怪しいと思われます。
今回のデータは会社の人が社内用の掲示板にあげたものを入力しました。添付ファイルとして******.txtというテキストファイルで掲示板にはあったのですが、これをダウンロードすると文字化けをしていたのでここからコピペすることはやめました。代わりに掲示板ではtxtファイルはダウンロードせずとも掲示板にそのまま表示できたので、これをコピペしてphpmyadmin上から入力していたと思われます。随分前のことなので記憶にないけど推測です。掲示板では表示されていたけど、これはブラウザの解釈が正しく見せていただけで本当は文字化けしたものをコピペしちゃっていたからではないかと思います。
UTF-8には、mac os独自仕様のUTF-8-MACというものがあるらしいです。これは全角の濁点を1つの文字として認識するとか。ただ新しいブラウザではこれをちゃんと解釈して1文字に見せてくれていたようです。なのでIE8などの古いブラウザでは、「が」→「か・」「で」→「て・」などと文字化けする現象が起こるようです。UTF-8-MAC文字コードなのかとか正規化の話だと難しいところはありますが、このあたりの問題と思って間違いないようです。
とにかくmacではUTF-8をincovというのを使って通常のUTF-8に変換してからファイルをlinuxwindowsに渡した方が問題なさそうです。最近ではrubyperlでもUTF-8-MACからUTF-8への変換もできるみたいです。システムにそもそもコピペじゃなく手動で入力すれば、当然大丈夫だけど量によっては無理だし。コピペでやってシステムで問題ないのにわざわざバックアップまで確認するようなことはしないから気づかないし。バックアップがちゃんととれているかどうかというのはシステム管理者、サーバ管理者としてちゃんとするべきだけど、コマンドエラーとかじゃないので検出も難しいですよね。とにかく気づきにくいし、解決しにくいしめんどくさい問題ですね。