* 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なテーブルでは資源が余計に要るのか。

これに関しては [[Changes in release 4.1.16:http://dev.mysql.com/doc/refman/4.1/en/news-4-1-16.html]] で Specified key was too long を検索すると,MySQL のバグだったみたい。

これについては [[Japanese: MySQL UTF8読み込みエラー:ERROR 1071 (42000):http://moodle.org/mod/forum/discuss.php?d=51988#243920]] で議論されている。
いろいろな解決法があると思うが,たまたま私は次のような小細工でうまくいった。
これはすでに utf-8 化した Moodle 1.5.3+ から 1.6.1 にデータを移行する際の話である。

sed 's/ varchar(250) / varchar(150) /g' moodle-utf8.sql >x.sql
 sed 's/ varchar(250) / varchar(150) /g' moodle-utf8.sql >x.sql

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

** その他 [#u91c5e1d]

-http://moodle.org/mod/forum/discuss.php?d=51988