文字コード latin1 の MT4 を utf8 の MT5 に移行する方法

MySQL の文字コードが latin1 の MT4 を、文字コードを utf-8 に変換した上で MT5 に移行する方法です。うまくいくでしょうか(理解が足りない部分もあると思うので、ご指摘ください)。

今回は、MAMP のローカル環境で実験してみたいと思います。

MySQL の文字コードが latin1 の MT4

この MT4 には以下のような2つのブログが存在しています(かっこ内は ID)。

  • My First Blog(ブログ:1)
    • Movable Type へようこそ!(ブログ記事:1)
    • ファーストブログ公開(ブログ記事:2)
  • My Second Blog(2)
    • セカンドブログ公開(ブログ記事:4)

また、データベース名は「mt4」です。

データベースをダンプする

まずは、このデータベースの文字コードを確認してみます。ターミナルから次のコマンドでデータベースにログインします(データベース名は適宜変更してください)。

$ mysql -u root -p
Enter password: root
mysql>  

ログインしたら、次のコマンドでデータベースの情報を確認します。

SHOW CREATE DATABASE mt4;

結果は次の通り。文字コードが latin1 ですね。

+-----------+------------------------------------------------------------------------------------------------+
| Database | Create Database |
+-----------+------------------------------------------------------------------------------------------------+
| mt4 | CREATE DATABASE `mt4` /*!40100 DEFAULT CHARACTER SET latin1 COLLATE latin1_general_ci */ |
+-----------+------------------------------------------------------------------------------------------------+

このとき、「CHARACTER SET latin1 COLLATE latin1_general_ci」の部分をメモしておきましょう。

次に、このデータベース mt4 をダンプ(データの内容を出力すること)します。いったん control + D でデータベースからログアウトして、次のコマンドでダンプします。

mysqldump -u root -p --default-character-set=latin1 mt4 > mt4_latin1.sql
Enter password:  

これで、mt4_latin1.sql という文字コード latin1 のファイルが作成されました。

文字コードを変換する 

次に、この文字コードが latin1 であるダンプファイルの文字コードを、nkf コマンドを利用して utf-8 に変換します。最初に、nkf が使えるか確認します。

nkf --version

nkf がインストールされていなかったら、MacPorts で nkf をインストールします(参照:nkfインストール - 備忘録代わりの日記)。

sudo port install nkf

 nkf コマンドの準備ができたら、次のコマンドで mt4_latin1.sql の文字コードを utf-8 に変換します。

$ nkf -w mt4_latin1.sql > _mt4_utf8.sql

これで、文字コードが utf-8 である _mt4_utf8.sql というファイルが出来ました(注)。

(注)この nkf での文字コードの変換ですが、Mac では、ファイルの内容によってうまく行ったり行かなかったりでした。うまくいかない場合は、変換元ファイルを Linux(CentOS)の環境にアップロードして、そこで全く同じように nkf コマンドを実行したらうまくいきました。
また、ここではあえて元ファイルは残しながら作業していますが、nkf に --overwrite オプションを付ければ上書きできます(バージョンによるそうです)。

ファイル中の latin1 という文字列を utf8 に置換

次に、_mt4_utf8.sql に記述されている「latin1」を「utf8」に置換します。

なお、先ほどメモして置いた「CHARACTER SET latin1 COLLATE latin1_general_ci」で、「COLLATE」の「latin1_general_ci」は「utf8_general_ci」になるようにする必要がありますので、もし元が「latin1_general_ci」でなければ、個別にうまく置換する必要があるかもしれません。

置換は sed コマンドを利用します(UTF-8 で保存できればテキストエディタでも構いません)。

sed -e 's/latin1/utf8/g' _mt4_utf8.sql > mt4_utf8.sql

これで、文字コードが utf-8 のファイルで、中身も utf-8 のファイルができました。ただし、この置換だとすべての latin1 と言う文字列が utf8 になってしまうので、もう少し気を遣った方がいいかもしれませんね。

なお、-i オプションを付けると引数のファイルを上書きできるようです。

データベースをリストア

次に、mt4_utf8.sql からデータベースをリストアします。

まず、MySQL にログインし直してから、次のコマンドで utf-8 のデータベースを作ります。データベース名は「mt5utf8」とします。

CREATE DATABASE  `mt5utf8` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

データベースが作れたら MySQL をログアウトします。

次に、このデータベース mt5utf8 に、文字コードを変換したダンプファイルの mt4_utf8.sql を使ってリストアします。

mysql -u root -p --default-character-set=utf8 mt5utf8 < mt4_utf8.sql

これで ERROR が出なければリストア完了です。

MT5 をインストール

あとは、このデータベースを指定して MT5 をインストールすれば OK です(省略)。

そういえば、MT4 と MT5 とでは、ウェブサイトという概念が出来たことによりだいぶ構成が変わりましたね。MT4 → MT5 に移行するとき、ブログIDを変更したりする必要もあるかもしれませんので、その辺りの事前の設計には十分に注意しましょう。

以上です。

2012年5月19日追記

nkf と sed の上書きするオプションについて追記しました。

参考サイト

MySQLに既に存在するデータベース内部の文字コードを、latin1からutf8に変換する方法。 - RAILS PRESS 

  • このエントリーをはてなブックマークに追加
Just a second...