2008年03月12日
Movable Type のバージョンあげて文字コードも変える方法
MySQL を使っているレンタルサーバ上で
Movable Type を 3 系列から 4 系列にバージョンを上げる。
しかも文字コードを EUC-JP から UTF-8 に変える。
その上、データベースをコピーして、コピー先データベースで MovableType を動かす。
そのまとめを書きます。
前の記事には書いてないテクも書いてるでよ!
前の記事読んだ人も必見!
Movable Type を 3 系列から 4 系列にバージョンを上げる。
しかも文字コードを EUC-JP から UTF-8 に変える。
その上、データベースをコピーして、コピー先データベースで MovableType を動かす。
そのまとめを書きます。
前の記事には書いてないテクも書いてるでよ!
前の記事読んだ人も必見!
中江が借りてるレンタルサーバ上では
MySQL サーバが一度に受け取れるデータ量が極端に少ないです。
具体的に書くと、max_allowed_packet が極端に小さい。
色々と困難がありました。
中江が借りてるレンタルサーバ上でなくても気をつけたいのが
Movable Type のデータベーステーブルである mt_session と mt_plugindata。
mt_session と mt_plugindata には
blob と呼ばれるバイナリデータが入ってます。
バイナリデータまで文字コード変換ソフトにかけちゃうと
変えちゃいけないバイナリデータまで変換されちゃう。
これも困ったものでした。
でも見事解決!
んじゃ方法を書きますね。
まず、mt_plugindata と mt_session 以外のデータを作ります。
なぜ二つだけのけ者にしてるかは後で。
一行目で mysql から Movable Type のデータを抜いています。
--default-character-set=binary は元データが EUC-JP なので
MySQL が文字コード自動変換して問題を起こさないように。
--skip-extended-insert はとても長い INSERT 文を使われると
あとで MySQL にデータを入れる時にエラーが起こるので。
--ignore-table が二つありますが、これは
mt_plugindata と mt_session は無視してね、という意味。
二行目では latin1 とかかれているところをすべて
utf8 という単語に変換しています。
データベーステーブルを latin1 という文字コードで作られると
後がメンドクサイので。
で、3行目で文字コードを EUC-JP から UTF-8 に変えています。
これで mt_plugindata と mt_session 以外のデータを作りました。
次は mt_plugindata と mt_session を作りましょう。
さっきと違うところは、一行目の --hex-blob と
三行目の iconv 文自体がないことですね。
--hex-blob は、バイナリデータを 0x10 や 0xff などと
普通のアルファベットの16進数で書きなさい、という意味。
これだと問題が少なくなるので重宝します。
なぜここで --hex-blob を使って、さっきは使わなかったかというと
前のヤツで --hex-blob を使うと、日本語の文まで
0x5a とか16進数で書かれちゃうからです。
そうすると iconv などの文字コード変換ソフトをいくらかけても
EUC-JP から UTF-8 に文字コードが変わらなくなります。
それと --hex-blob を使うとデータが半角英数字のみになるので
文字コード変換は必要ないです。
EUC-JP と UTF-8 の半角英数字はまったく同じですからね。
超カッコイイ!
ではデータは作り終わりました。
MySQL にデータをいやらしくつっこみましょう!!
おっと、この文を実行する前に
UTF-8 でコピー先データベースを作っておいて下ちい。
中江が借りてるレンタルサーバの場合、データベース作成は
Web からじゃないとできないのでココでは割愛。
んじゃ、データベースにデータ突っ込み終わりました?
それじゃあ Movable Type で見てましょう!
3 系列でも 4 系列でもいいよん。
文字化けしてませんか?
してますよね?
中江も文字化けしてました。
これはですね、データベースのコピーと文字コード変換が
失敗してるのではなく、Movable Type がいやらしいからです。
Movable Type はデータベースの文字コードをなんでもかんでも
latin1 で読もうとするからみたいです。
MySQL は、フザケタことに文字コードを勝手に自動変換しますので
色々問題がおこるのです。
データベースは UTF-8 で作られていて
latin1 として接続すると・・・・
勝手に、MySQL が UTF-8 を latin1 に変換して
さらに Movable Type が UTF-8 に変換してくれます。
文字化けまくります。
でも防ぐ方法もあります。
Movable Type が latin1 じゃなくて UTF-8 で
MySQL に接続してくれればいいんです。
これを mt-config.cgi に書いて下さい。
どこでもいいです。
これで完了!
いやー長かった。
これで台湾の人とも交流しやすくなるぜ!
MySQL サーバが一度に受け取れるデータ量が極端に少ないです。
具体的に書くと、max_allowed_packet が極端に小さい。
色々と困難がありました。
中江が借りてるレンタルサーバ上でなくても気をつけたいのが
Movable Type のデータベーステーブルである mt_session と mt_plugindata。
mt_session と mt_plugindata には
blob と呼ばれるバイナリデータが入ってます。
バイナリデータまで文字コード変換ソフトにかけちゃうと
変えちゃいけないバイナリデータまで変換されちゃう。
これも困ったものでした。
でも見事解決!
んじゃ方法を書きますね。
まず、mt_plugindata と mt_session 以外のデータを作ります。
なぜ二つだけのけ者にしてるかは後で。
% mysqldump -u ユーザ名 -p --default-character-set=binary --skip-extended-insert --ignore-table=データベース名.mt_plugindata --ignore-table=データベース名.mt_session データベース名 > 一時ファイル1
% sed 's/latin1/utf8/g' < 一時ファイル1 > 一時ファイル2
% iconv -c -f EUC-JP -t UTF-8 < 一時ファイル2 > 一時ファイル3
一行目で mysql から Movable Type のデータを抜いています。
--default-character-set=binary は元データが EUC-JP なので
MySQL が文字コード自動変換して問題を起こさないように。
--skip-extended-insert はとても長い INSERT 文を使われると
あとで MySQL にデータを入れる時にエラーが起こるので。
--ignore-table が二つありますが、これは
mt_plugindata と mt_session は無視してね、という意味。
二行目では latin1 とかかれているところをすべて
utf8 という単語に変換しています。
データベーステーブルを latin1 という文字コードで作られると
後がメンドクサイので。
で、3行目で文字コードを EUC-JP から UTF-8 に変えています。
これで mt_plugindata と mt_session 以外のデータを作りました。
次は mt_plugindata と mt_session を作りましょう。
% mysqldump -u ユーザ名 -p --default-character-set=binary --skip-extended-insert --hex-blob データベース名 mt_session mt_plugindata > 一時ファイル4
% sed 's/latin1/utf8/g' < 一時ファイル4 > 一時ファイル5
さっきと違うところは、一行目の --hex-blob と
三行目の iconv 文自体がないことですね。
--hex-blob は、バイナリデータを 0x10 や 0xff などと
普通のアルファベットの16進数で書きなさい、という意味。
これだと問題が少なくなるので重宝します。
なぜここで --hex-blob を使って、さっきは使わなかったかというと
前のヤツで --hex-blob を使うと、日本語の文まで
0x5a とか16進数で書かれちゃうからです。
そうすると iconv などの文字コード変換ソフトをいくらかけても
EUC-JP から UTF-8 に文字コードが変わらなくなります。
それと --hex-blob を使うとデータが半角英数字のみになるので
文字コード変換は必要ないです。
EUC-JP と UTF-8 の半角英数字はまったく同じですからね。
超カッコイイ!
ではデータは作り終わりました。
MySQL にデータをいやらしくつっこみましょう!!
mysql -u ユーザ名 -p --default-character-set=utf8 コピー先データベース名 < 一時ファイル3
mysql -u ユーザ名 -p --default-character-set=utf8 コピー先データベース名 < 一時ファイル5
おっと、この文を実行する前に
UTF-8 でコピー先データベースを作っておいて下ちい。
中江が借りてるレンタルサーバの場合、データベース作成は
Web からじゃないとできないのでココでは割愛。
んじゃ、データベースにデータ突っ込み終わりました?
それじゃあ Movable Type で見てましょう!
3 系列でも 4 系列でもいいよん。
文字化けしてませんか?
してますよね?
中江も文字化けしてました。
これはですね、データベースのコピーと文字コード変換が
失敗してるのではなく、Movable Type がいやらしいからです。
Movable Type はデータベースの文字コードをなんでもかんでも
latin1 で読もうとするからみたいです。
MySQL は、フザケタことに文字コードを勝手に自動変換しますので
色々問題がおこるのです。
データベースは UTF-8 で作られていて
latin1 として接続すると・・・・
勝手に、MySQL が UTF-8 を latin1 に変換して
さらに Movable Type が UTF-8 に変換してくれます。
文字化けまくります。
でも防ぐ方法もあります。
Movable Type が latin1 じゃなくて UTF-8 で
MySQL に接続してくれればいいんです。
PublishCharset UTF-8
SQLSetNames 1
これを mt-config.cgi に書いて下さい。
どこでもいいです。
これで完了!
いやー長かった。
これで台湾の人とも交流しやすくなるぜ!
Movable Type のバージョンあげて文字コードも変える方法 | 08:04
│コメント(0)
│トラックバック(0)
Movable Type のバージョンあげて文字コードも変える方法へのトラックバックURL
http://app.blog.livedoor.jp/uradiet/tb.cgi/51061842



