Moodle 1.6にはUTF-8移行ツールが付くらしい。
古いデータをバックアップ
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
のようにするとよい。
上記のようにして取り出したダンプファイルを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なテーブルでは資源が余計に要るのか。
これに関しては Changes in release 4.1.16 で Specified key was too long を検索すると,MySQL のバグだったみたい。
これについては Japanese: MySQL UTF8読み込みエラー:ERROR 1071 (42000) で議論されている。 いろいろな解決法があると思うが,たまたま私は次のような小細工でうまくいった。 これはすでに utf-8 化した Moodle 1.5.3+ から 1.6.1 にデータを移行する際の話である。
sed 's/ varchar(250) / varchar(150) /g' moodle-utf8.sql >x.sql
古い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 な文字も扱ってくれるみたい。