MySQL4.0からMySQL5へ移行するときのメモ書き。
breakscan.comのデータベースはMySQL4.0を採用していて諸事情により文字コードをShift_JISで運用している。もしMySQL5へ移行する場合、データベースサーバー側の文字コードはutf-8になりアクセス側のクライアント側が自分の文字コード(sjis)を指定する。
MySQL4.0のときはサーバー側の文字コードをlaten1にしておくと何でも入れることができたのでほとんどのテーブルはShift JISなのだが、ネットエイドの一部だけutf-8という変則運用をしている。
通常MySQLデータベースのバックアップと復旧は、mysqldumpコマンドとmysqlコマンドを使うのだけれど、そのままだと文字コード絡みで文字化けする。バックアップファイルの先頭に「SET NAMES sjis」とおまじないすれば通る場合もあるけれど変則運用の所作か通らない。怪しいテーブルのないMovableTypeは--default-character-set=sjisで通りそうなのだけれどやはり文字化けする。
最終的にphpMyAdminを使うことで移行できるのだが、バックアップしたデータのフィールドデータ末尾にShift JISのダメ文字が含まれるとインポートでエラーになる。フィールドデータは 'abc' などと アポストロフィーで括られるのだが末尾にダメ文字があると該当のSQL文で失敗する。
例えば '発表' はShift JISの場合に、'発表\' と出力される。どうもダメ文字の表ではなく直後の ' を普通の文字と処理しようとしているらしい。当然桁が合わないからSQL文は失敗する。成功しても困るけれど。
対策はアポストロフィー直前のダメ文字との間に全角空白を挟むこと。phpMyAdminでちまちま全角空白を追加した。
utf-8を含むテーブルはphpMyAdminで個別にエクスポート・インポートすることで解決した。
手順としては次のようになる。
- (以下はダメ文字処理した後のこと。ダメ文字を見つけたら後戻り有り。エディタでダメ文字を手直しという手もあるが時間的余裕がないときは事前に処理しておいたほうがよい)
- MySQL4.0のphpMyAdminからデータベースをエクスポート。このとき文字コードに合わせて表示の言語(文字セット)を変更する。utf-8を含むテーブルは表示をutf-8に変更して個別にエクスポートする。表示出力するファイルが大きくなるのでzip圧縮を行うが、場合によっては移行先のphpのファイルサイズ制限の変更が必要になる。
- 移行側のMySQL5のphpMyAdminで新しいDBを使用する照合順序で作成する。ここではsjis_japanese_ci。
- MySQL5のphpMyAdminでDB名を選択してインポート。ファイルの文字セットはここではsjis、さらにSJISエンコーディングへ変換するをチェック。大きなデータベースだとそれなり実行時間がかかる。
- 個別事情のutf-8なテーブルをインポート。
- ここまででインポートは終了
- (MovableTypeでは、クライアント文字コードを指定するためにm-config.cgiに SQLSetNames 1 を追加。)
以上が終了したらphpMyAdminで文字化けが無いか確認、個別アプリケーションで文字化けが無いか確認。
と、ここまで書いたのはサーバーのRAID1でデグレードが発生して、HDD交換しようとしたらRAIDカードで新HDDを認識しない。今月2回のメンテナンスはここまで。さらに週末RAIDカードの動作確認を行い解決しないときは先日導入した新サーバーへ移行を検討している。現サーバーへMySQLサーバーをインストール時すでにバージョン5がリリースされていたが諸事情で4.0をインストールしていた。新サーバーは5をインストールせざるおえないので、「もし」移行するときはメモ書きが必要になる。
ここでcp932を選ばずにsjisを選んでいるのは諸事情。だから数字に○のNEC拡張漢字などは文字化けする。cp932を選べば解消するが諸事情ってやつだ。
コメント