mantis 1.0.7から1.1.0a4への移行 できず の続き(文字化け解決編)

先日http://www.mantisbt.org/wiki/doku.php/mantisbt:upgrade_to_utf8にある
UTF-8への移行方法の結果です。ここにある手順を乱暴に書くと、DBのdefault character set をUTF-8にした別DBを作り、mysqldumpで現行DBからダンプファイルを取得して、iconvでlatin1からUTF-8に変換してimportせよ。と。

現行のDBのdefault charset setはUTF-8だから特段変更する必要はないのかなと思い省略。ダンプファイルをiconvで変換した結果は文字化けしていないものだと期待いていたのだが、文字化けしたまま。importしても文字化けが解消されるとは思えないので、インポートは行わず。結局、この方法でもダメなのかもしれない。

そもそも、1.1.0a4の何処で文字化けをおこしているのか、その原因を突き止める方向に変更。1.0.7のソースを見る限りではDBとの読み書きで特段の変換処理は行っていない様子。では、1.1.0a4ではどうかと思ったが、こちらも無し。でも、1.1.0系はUTF-8が標準だということなので、どこかで明示的に文字コードの指定をしているのかもしれないと予想を立て、utf8でgrepしてみる。ビンゴ。core/database_api.phpのdb_connect関数の中でSET NAMES UTF8している。この部分をコメントアウトしてみると、文字化けは解消された。

という経緯で、UTF-8と指定しなければ(latin1で読み込めば?)文字化けしない可能性が出てきた。そこで試したのがこの方法

$ mysqldump -u DBユーザ名-p bugtracker --default-character-set=latin1 > bugtracker-latin1.sql
$ sed -e 's/latin1/utf8/g'  <  bugtracker-latin1.sql >bugtracker-latin1-utf8.sql
$ mysql -u DBユーザ-p bugtracker < bugtracker-latin1-utf8.sql

エディタで文字コードをUTF-8に指定してmysqldumpで出来上がったbugtracker-latin1.sqlを開いてみると文字化けしていない!!。ダンプファイルの中ではcharcter setをlatin1に指定しているのをutf8に置換して、インポート。先ほど編集したcore/database_api.phpを元に戻して画面を開いていると、無事文字化けしていない。

ふ~やれやれ。文字コードの問題はこれで解決。残る問題はテーブルの変更。alter文が分かれば何とかするのだけどな・・・。列の追加や型/桁の変更は定義を見比べて調べることはできるのだけど、UPDATEする必要があるのは調べられないし、追加した列が必須入力の場合には妥当な値を調べる必要があるし。英語では更新できるようなので、その方法を調べればよいのか?!

念のため、charcter set 関連のパラメータ

mysql> SHOW VARIABLES LIKE 'char%';
+--------------------------+----------------------------------------+
| Variable_name            | Value                                  |
+--------------------------+----------------------------------------+
| character_set_client     | utf8                                   |
| character_set_connection | utf8                                   |
| character_set_database   | latin1                                 |
| character_set_filesystem | binary                                 |
| character_set_results    | utf8                                   |
| character_set_server     | utf8                                   |
| character_set_system     | utf8                                   |
| character_sets_dir       | /usr/local/mysql/share/mysql/charsets/ |
+--------------------------+----------------------------------------+
8 rows in set (0.01 sec)

mysql>

あっ。character_set_databaseがlatin1のままだ。テーブル変更の方法が判ったら、これも直してやり直そう。

Trackback URL

Leave a comment

Your comment