6月
29
WordPress ME2.2.3 から日本語版2.5.1へ移行(文字化け対処編)
Filed Under WordPress — Imai @ 23:09:22
WordPress ME2.2.3 から日本語版2.5.1へ移行(手順編) : Imai blog で移行手順を書きましたが、初めはwp-content/upgrade.phpでデータベース変換をおこなったら、記事などデータベースから取り出している日本語が全て文字化けしていました。loginもできません。wp-config.phpに増えた
define('DB_CHARSET', 'utf8');
が関係ありそう。ちなみにこの行をコメントアウトしたら正常に表示され、loginもできました。でもこのまま使用し続けると後々面倒になるかもしれないと思い、define('DB_CHARSET', 'utf8');を有効にしたまま動くようにできないかとネットで情報を探しましたがわかりません。当てずっぽうに、alter table で、CONVERT TO CHARACTER SET や DEFAULT CHARACTER SET をしても駄目でした。どうもMEで使っていたテーブルのデフォルト文字セットと実際に入っているデータの文字セットが異なっていることが問題であることはわかったのですが、このときはもう深夜で眠気に勝てず頭も回らないので、とりあえずWordPressをMEに戻して終了。
次の日、もう一度整理しなおしました。(操作している端末のエンコードはutf-8です)
まず、DB_CHARSETを使っているところを探すとwp-include/wp-db.php内のSET NAMESで使われていました。
次に、初めから日本語版2.5.1をインストールしたデータベースとME2.2.3のデータベースを比較しました。
- テーブルのデフォルト文字セット(
show create tableで確認)- 日本語版
utf8 - ME
latin1
- 日本語版
- mysqlコマンドラインツール内で
select時の日本語データの見え方- 日本語版
デフォルト(またはSET NAMES latin1;)で、文字化け
SET NAMES utf8;で正常に見える。 - ME
デフォルト(またはSET NAMES latin1;)で、正常
SET NAMES utf8;で文字化けする。
- 日本語版
mysqldumpでダンプしたSQLの日本語データの見え方- 日本語版
--default-character-set=latin1で、文字化け
--default-character-set=utf8で、正常 - ME
--default-character-set=latin1で、正常
--default-character-set=utf8で、文字化け
- 日本語版
これらの結果から、
- デフォルト文字セットと中のデータの文字セットが、
- MEは、デフォルト文字セットはlatin1だが中のデータはutf8で記録されている
- 日本語版は、デフォルト文字セットはutf8で中のデータもutf8で記録されている
と考えられる。
- MEでは
SET NAMESは行っていない。character_set_{client,connection,results}はデフォルトのlatin1でテーブルの文字セットと同じであり、文字コード変換は行われない。よってテーブル内のutf8データがそのまま見えるため文字化けしない。 - 日本語版では、
SET NAMES utf8;が行われている。character_set_{client,connection,results}はutf8でテーブルの文字セットと同じであり、これも文字コード変換は行われない。よってテーブル内のutf8データがそのまま見えるため文字化けしない。 - ME→日本語版にデータベースを変換した場合、
character_set_{client,connection,results}はutf8だが、テーブルのデフォルト文字セットはlatin1になっている。よってテーブル内utf8データに対してlatin1→utf8変換が行われるので文字化けする。
と判断。ここから日本語版のupgrade.phpを動かす前に、中のデータは変更せずにデフォルト文字セットをlatin1からutf8に変更すればうまくいくのではないかと予想。(そもそもデフォルト文字セットがlatin1なのに中のデータがutf8で入っていることがおかしい?)
ところが、その方法がわからない。前日やったようにalter tableではデータが変わってしまうようだ。(*1)
いろいろ試した結果、元のMEのテーブルを、--default-character-set=latin1でダンプし、テキストエディタでそのSQL内latin1をutf8に変更してから、mysqlに戻すという、(手順編) に書いた方法でうまくいきました。
ひとつ懸念事項があって、初めから日本語版をインストールしてSK2をいれたWordPressのSK2関連テーブル(sk2_blacklist, wp_sk2_logs, wp_sk2_spams)のDEFAULT CHARSETはlatin1ですが、今回ME→日本語版は全てSK2関連テーブルもutf8にしました。これはどちらが良いのかわかりませんが、これらのテーブルにも日本語は入っているのでutf8の方が良いのではないかと思っています。プラグインのテーブルなので、まずいようだったらSK2を無効化して関連テーブルを削除してから、SK2を再インストールすれば良いと思っています。
以上
(*1)
後から、MySQL 5.1 リファレンスマニュアル を詳しくみると、一度カラムのタイプをBLOBにしてからCONVERT TOで文字セットを変更し、カラムタイプを元に戻すという方法がかかれていた。でも大変そう。
おまけ
さて、今回の移行作業は事前にネットで調べてみた感触とは大きく異なり、予想外に苦戦したわけですが、世間ではなぜにうまくさくっと移行できているのか?もう一度ネットを検索したりしてその理由を考えてみました。
- たぶんME時代からテーブルのデフォルト文字セットがutf8になっており、
set names default;もutf8だった。 skip-character-set-client-handshakeが設定されており、文字コード変換が行われない。- 日本語版を上書きインストールし、ME版のwp-config.phpが使われていて、
define('DB_CHARSET', 'utf8');がない。(例: WordPress 2.2.3 ME から 2.5.1 へ | ぶっちろぐ )(*2) - 間違って、
define('DB_CHARSET', 'UTF-8');と設定している。set names UTF-8;はエラーになるのでコメントアウトした場合と同様、latin1のままになっている。(例: WordPress ME2.2.1から日本語版2.5.1移行の記録 | Nai-Nore ) - 常日頃の行いが良い。
きっと、環境によるところが多いのでしょうね。私のとった手段もあっているかどうかわからないし。
(*2) ‘08.12.1追記
ぶっちろぐさまから、ぶっちろぐさまのサイトではME時代からDB_CHARSETは入っていて、DB上の漢字コードもUTF8だったとご連絡を頂きました。ありがとうございました。
調べてみたところ、ME2.1.3のwp-config-sapmle.phpには、DB_CHARSET, DB_COLLATE は無かったのですが、ME2.2.3のwp-config-sample.phpにはありました。当サイトでME2.1.3→ME2.2.3移行時にME2.1.3のwp-config.phpをそのまま使ったものと思われます。大変失礼いたしました。
この文字化けの問題は、本来ME2.1.3→ME2.2.3移行時に起こるものなのかもしれません。
初めまして。
Referer 覗いていたら「例」となって私の Weblog がリンクされていたので書込してみます。
define(‘DB_CHARSET’, ‘utf8′);
この記載が無いとのことですが、当方の WP では ME 時代からこの記述をしておりました。
DB 上でも UTF8 です。これによりなんら問題無く移行は行えました。
現在も ME を使っていた conf を使用していますがなんら問題無く稼働しております。
ぶっちろぐ さま
はじめまして。コメントありがとうございます。
記事投稿時、同様のサイトがいくつかあったのですが、ぶっちろぐさまのサイトがわかりやすかったので、参照させていただきました。
調べてみた結果は本文に追記した通りです。良くない例として間違って参照してしまい、申し訳ありませんでした。
もう一箇所参照させていただいているサイトでも、ME2.2→日本語版2.5時に DB_CHARSETが増えたとの記述もあり、当方でもそのように見えたので、ME2.2にはDB_CHARSETは無かったと思い込んでいました。
本文中はリンクに取り消し線をつけましたが、他人のサイトのリンクに取り消し線をつけるのはちょっと申し訳ない気もしています。もし、リンクそのものを削除等、他の方法がよろしければ、お手数でが再度ご連絡下さい。