MySQLバックアップ時の文字コードトラブル August 31, 2007
Rating: 3.5

先日、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と同じ文字コードを指定してバックアップすることで問題は解決しそうに思える。 ところが、このバックアップデータを実際にリストアしてみると途中でエラーが出てロードに失敗した。

結論としては、

  1. mysqldump –default-character-set=binaryでバックアップデータを取得(この場合Server charactersetの文字コードでダンプされる)
  2. 出力されたSQLファイルをnkfでDb charactersetに変換

という手順でエラーもなくリストアできた。

なお、MySQLのデータをシフトJISからUTF-8に変換した際の記録(sanonosa システム管理コラム集)によると、nkfでエラーが出る場合はiconvで文字コード変換するとスキップできる場合があるようだ。

Comments are closed.