サーバ移転にまつわるエトセトラ(主にMySQL5の文字化け対策)

※以前別の場所で書いた文章を備忘的に書き記しておきます。

【投稿年月日】2008-03-27 【ジャンル】PHP/MySQL

 「ma-bank.com」ドメインのサーバ切替(DNS情報の変更)を3月25日15時前後に実施したところ、3月27日17時前後に世界中のDNSサーバに情報が行き渡ったようです。旧サーバのアクセスログを見るとそれ以降アクセスした形跡がないので、サーバ切替に要した時間は50時間ということになります。
 時間が結構かかるものだと思われるかもしれませんが、実を言うと、ma-bank.comへのアクセスの99%は、3月26日から新サーバへ切り替わっていました。1%のアクセスだけが、ズルズルと旧サーバへアクセスを繰り返していたのです。ちなみに、3月26日から3月27日にかけて旧サーバにアクセスしていたのは、asianetcom.netのクローラーだけです。(笑)

 ところで、サーバ移転を機に、サイトの文字コードをEUC-JP(ujis)からUTF-8に変更しました。これはMySQL4.0からMySQL5へデータ移行する際に発生した文字コード関係の問題のためです。いろいろ試してみましたが、EUC-JPだと、何かしら不都合が生じてしまうのです。
 と言うわけで、最近プログラムのほとんどをUTF-8で記述していることもあって、(大胆にも)文字コードを変更することにしました。

 以下、「Nucleus」というCMSのサーバ移転時に実施した作業を備忘的に残しておきます。


◇旧サーバ(※MySQL4.0。文字コードEUC-JP)

  1. phpMyAdminの「エクスポート」機能を使ってdumpファイルをダウンロード。(※設定等については後述)

◇ローカルでの作業

  1. ダウンロードしたdumpファイルをエディタで開いて、以下の文字を一括置換。
    1. 「japanese-euc」を「japanese-utf8」に変換。
    2. 「charset=EUC-JP」を「charset=UTF-8」に変換。
    3. 「encoding="EUC-JP"」を「encoding="UTF-8"」に変換。
    4. 「encoding=\"EUC-JP\"」を「encoding=\"UTF-8\"」に変換。
    5. 「ja_JP.eucJP」を「ja_JP.utfJP」に変換。
  2. 文字コードをUTF-8で保存。

◇ローカルサーバ(※MySQL5。文字コードUTF-8)

  1. 「Nucleus」をインストール。
  2. phpMyAdminでNucleusの全テーブルのデータを空にする。
  3. phpMyAdminの「インポート」機能を使ってdumpファイルを読み込む(「ファイルの文字セット」があれば読み込む際に「utf8」と設定する)。ファイルサイズが大きいときは適宜分割。
  4. phpMyAdminの「エクスポート」機能を使ってdumpファイルを書き出し。(※設定等については後述)

◇新サーバ(※MySQL5。文字コードUTF-8)

  1. 「Nucleus」をインストール。
  2. phpMyAdminでNucleusの全テーブルのデータを空にする。
  3. phpMyAdminの「インポート」機能を使ってdumpファイルをアップロード(「ファイルの文字セット」があればアップロードする際に「utf8」と設定する)。ファイルサイズが大きいときは適宜分割。

 MySQLのバージョンが大きく異なる上に文字コードをEUC-JPからUTF-8に変更するので、念のためにローカルサーバでデータをMySQL4.0からMySQL5(EUC-JPからUTF-8)へ変換しましたが、これは絶対に必要な手順という訳ではないと思います。なお、ローカルサーバでMySQLやPHPを使うには「xampp」を利用するのがお手軽です。

◇phpMyAdminの「エクスポート」設定

phpMyAdminエクスポート
 この中の「長い INSERT 文を作成する(拡張 INSERT 文を作成する)」というオプションは、マルチプル「INSERT INTO」を作成してqueryの発行回数を激減させる効果があるので、データ量が結構多い時など重宝するかと思われます。マルチプル「INSERT INTO」については、「MySQLの最適化」や「サイトリニューアルに伴なうMySQLの最適化」をご覧下さい。

 MySQL4.1・MySQL5系では(特にphpMyAdminで)文字化けが発生しやすいですが、テーブルの作成と、データの作成を切り離して作業すると、文字コードがUTF-8であれ、EUC-JPであれ、うまくいく可能性が高くなるような気がします。既存のシステム(※今回は「Nucleus」というCMS)を利用してサイトを構築している場合にサーバ移転する際は、新サーバに既存のシステムをインストールをして新たにテーブルを作成するのがベターかと。
 今回の場合、「Nucleus」をインストールすることで新たにテーブルを作成し、さらにテーブルの全データを一度空にした上で、改めて移転元のデータをphpMyAdminを通してテーブルに流し込みました。ちなみに、データのインポート時に、SQL文では「set names utf8;」、コマンドでは「--default-character-set=utf8」など、いろいろ試してみましたが、うまくいきませんでした。
 文字化けが起きていることが確認できたら、テーブルを一度全削除した上で、あらためてテーブルを作り直してからデータをインポートした方がいいと考えています。データを空にするだけでは根本的な解決にならないみたいなので。

 ところで、「phpMyAdminの文字化け解消」において、かなり乱暴なやり方(※phpMyAdminのコードの書換え)で文字化けを回避しましたが、試しに今回の作業後にphpMyAdminのコードを元に戻したところ、どういう訳か文字化けが直っていました。(笑)

 参考資料としてMySQL5における「my.cnf」の文字コード関係の設定を書き記しておきます。
[mysqld]
 default-character-set=utf8
 character-set-server=utf8
 init-connect="SET NAMES utf8"
 skip-character-set-client-handshake

 なお、文字コードがEUC-JPでも、phpMyAdminでインポートする際に、「ファイルの文字セット」を「ujis」と設定すれば、文字化けすることなく取り込まれました。
 文字コードのことがあって苦手意識を持っていたMySQL5ですが、基本に忠実でさえあれば、実はとても扱いやすいのかもしれません。



 最後にサーバ移転についての雑感。
 現時点ではサーバ移転は正解だったと思われます。レスポンスが早くなりましたし、MySQLのコネクトエラーに一度も遭遇していませんし、おまけにMySQL5の文字コードに対する理解が進んだような気がします。
 ただ、この状態がいつまで続くか分からないので、サーバ移転先の検討を引き続き行なっていこうと考えています。

EDIUNET | PHP/MySQL | 独り言 | 提供サービス | JavaScript