* MoodleのEUC-JP→UTF-8移行 [#q5dfcfcc]

Moodle 1.6にはUTF-8移行ツールが付くらしい。

** データベースの移行 [#p0f7c7c0]

古いデータをバックアップ

 mysqldump -u root --default-character-set=latin1 moodle >moodle.sql

これをUTF-8に変換するには次でいいはず:

 iconv -c -f EUC-JP-MS -t UTF-8 moodle.sql >moodlex.sql

ところがやってみると微妙に変換がおかしいところがあった(小文字全角ローマ数字?)。そこで

 nkf -Es moodle.sql | iconv -c -f CP932 -t UTF-8 >moodlex.sql

としたが,今度はnkfのバグで長い行がむちゃくちゃになってしまった。
そこで私が大昔に作った kf というフィルタを使う:

 kf -Es moodle.sql | iconv -c -f CP932 -t UTF-8 >moodlex.sql

これが一番良さそう。

次はデータベースの再構築:

 mysql -u root
 drop database moodle;
 create database moodle;
 grant select,insert,update,delete,create,drop,index,alter on moodle.*
    to moodleuser@ホスト名 identified by 'パスワード';
 quit
 mysql -u root --default-character-set=latin1 moodle <moodlex.sql

ところが次のようなエラー。

 ERROR 1153 (08S01) at line XXXX: Got a packet bigger than 'max_allowed_packet' bytes

/etc/my.cnf で max_allowed_packet を十分大きくしておく(16Mとか)。さらに

 mysql -u root --default-character-set=latin1 --max_allowed_packet=16M moodle <moodlex.sql 

のようにするとよい。

** 失敗談 [#q41a61a8]

上記のようにして取り出したダンプファイルをutf-8にしようとした:

 sed 's/\blatin1\b/utf8/g' moodlex.sql >moodle-utf8.sql

ところが

 mysql -u root moodle <moodle-utf8.sql 
 ERROR 1071 (42000) at line XXX: Specified key was too long; max key length is 1000 bytes

となってしまった。UTF-8なテーブルでは資源が余計に要るのか。

** moodledataの移行 [#had33d55]

古いmoodledataを持ってくる。

moodledata/cache/* を消す。

convmv (http://j3e.de/linux/convmv/) を使ってファイル名をUTF-8にする:

 # convmv -r -f euc-jp -t utf-8 moodledata

でテストしてうまくいきそうなら

 # convmv -r -f euc-jp -t utf-8 moodledata --notest

euc-jp-ms な文字も扱ってくれるみたい。