Movable Type のバージョンあげて文字コードも変える方法



2008年03月12日

Movable Type のバージョンあげて文字コードも変える方法

MySQL を使っているレンタルサーバ上で
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 以外のデータを作ります。
なぜ二つだけのけ者にしてるかは後で。


% 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 のバージョンあげて文字コードも変える方法へのトラックバックURL
http://app.blog.livedoor.jp/uradiet/tb.cgi/51061842
 
リンク
30日間無料教材!

アドセンスアフィリエイトパック
【アドセンスで確実に稼ぐ方法】


30日間のお試し期間あり。30日以内に返品すれば教材代金無料です。

詳細
脱初心者にサイテキ教材

月樹
〜アフィリエイトで月10万稼ぐための珠玉のアイディア集〜

【価格と内容が反比例】


何万円もするネットで稼ぐための教材にひけをとらない、低価格なのにボリューム厚く、内容も濃いすごい教材です。

月樹の詳細
メルマガアフィリバイブル(他称)



【ヌシも日給8万円じゃい】


初心者から上級者まで学べるメルマガ&ブログアフィリエイトの金字塔ッス

詳細レビューと超豪華特典
稼げる人脈の作り方
タグクラウド