MySQLバックアップ時の文字コードトラブル August 31, 2007
先日、XREAのMySQLデータベースをバックアップしたのだが、文字コードのトラブルでリストアできないことに気づいた。
経緯と対策を整理してみる。
問題は、MySQLの文字コードが4種類指定できてしまうことから来ている。
設定はmysqlに接続した状態でstatusコマンドを入力すると確認できる。
mysql> status
Server characterset: latin1 Db characterset: latin1 Client characterset: latin1 Conn. characterset: latin1 このうち、表データそのものはDb characterstの文字コードで格納されているが、mysqldumpコマンドで出力される文字コードはServer charactersetになる。 上の例ではたまたまlatin1に揃っている(latin1もまずいのだが)ものの、Db charactersetとServer charactersetが違っていると勝手に文字コードをServer charactersetに変換されてしまう。
適切に文字コードが揃うように設定してMySQLを再立ち上げすれば良い話だが、レンタルサーバーのデータベースの場合はそうもいかない。
そこでバックアップ時のオプションで、mysqldump –default-character-set=utf8のようにDb charactersetと同じ文字コードを指定してバックアップすることで問題は解決しそうに思える。 ところが、このバックアップデータを実際にリストアしてみると途中でエラーが出てロードに失敗した。
結論としては、
- mysqldump –default-character-set=binaryでバックアップデータを取得(この場合Server charactersetの文字コードでダンプされる)
- 出力されたSQLファイルをnkfでDb charactersetに変換
という手順でエラーもなくリストアできた。
なお、MySQLのデータをシフトJISからUTF-8に変換した際の記録(sanonosa システム管理コラム集)によると、nkfでエラーが出る場合はiconvで文字コード変換するとスキップできる場合があるようだ。