MoodleのEUC-JP→UTF-8移行

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を持ってくる。

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 な文字も扱ってくれるみたい。

その他


Last-modified: 2006-09-07 (木) 16:22:42 (4154d)