意外と手間取ったので記録しておく。
まず、データベースの文字コードの状況を確認する。
自宅サーバ側 mysql>status; Server characterset: ujis Db characterset: ujis Client characterset: ujis Conn. characterset: ujis 基本的にここがひとつの文字コードに統一されていれば問題なし。 自宅サーバはujisに統一されているというごく普通の状態。 念のため文字コード関連のシステム変数も表示 mysql>show variables; | character_set_client | ujis | | character_set_connection | ujis | | character_set_database | ujis | | character_set_filesystem | binary | | character_set_results | ujis | | character_set_server | ujis | | character_set_system | utf8 | | character_sets_dir | /usr/local/mysql/share/mysql/charsets/ | | collation_connection | ujis_japanese_ci | | collation_database | ujis_japanese_ci | | collation_server | ujis_japanese_ci | 一方CORESERVER側 mysql>status; Server characterset: utf8 Db characterset: ujis Client characterset: latin1 Conn. characterset: latin1 ちなみにこれはEUCで作成したデータベースを選択した状態。 utf8、latin1がまざっているという謎設定。 こりゃ、EUCでINSERTしたら文字化けするはずです。 ujisに統一しろよボケが。 mysql>show variables; | character_set_client | latin1 | | character_set_connection | latin1 | | character_set_database | ujis | | character_set_filesystem | binary | | character_set_results | latin1 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | /usr/local/mysql-src-5.1.22/share/mysql/charsets/ | | collation_connection | latin1_swedish_ci | | collation_database | ujis_japanese_ci | | collation_server | utf8_general_ci | めちゃくちゃ文字コードが混在してます。 ここまでくるとキモイとしかいいようがない。
で、ひとまずEUCで自宅サーバからSQL文をダンプする。
character_set_systemがutf8なのでmysqldumpで明示的に文字コードを指定しないとUTF8で出力されてしまうので注意。
$ mysqldump -uDBユーザ名 -pパスワード --default-character-set=ujis -F -l データベース名 > dump_ujis.sql
ダンプされたファイルを秀丸で開いて、文字コードがEUCかつ、日本語がきちんと読めることを確認する。
次にダンプしたファイルをCORESERVERにアップ。
その後、CORESERVERにSSHでログイン。
で、MySQLの文字コードをEUCに設定する。
mysql> SET characterset_set_client=ujis; mysql> SET characterset_set_connection=ujis; mysql> SET characterset_set_results=ujis; mysql> SET characterset_set_server=ujis; mysql> status; Server characterset: ujis Db characterset: ujis Client characterset: ujis Conn. characterset: ujis すべてがujisになっていることを確認。
ダンプしたファイルをインポートする。
mysql> source dump_ujis.sql;
SELECT文を適当にたたいて、EUCで日本語が文字化けしていないことを確認する。
さて、普通はこれで問題ないはずだが、CORESERVERは前述の通りMySQLのコネクションがlatin1なのでこのままだとXOOPSの表示で文字化けする。
そこで対策として、コネクション確立時に文字コードを明示的に指定する。
xoops/class/database/mysqldatabase.php の88行目に以下の一行を追加。 if($selectdb != false){ if (!mysql_select_db(XOOPS_DB_NAME)) { $this->logger->addQuery('', $this->error(), $this->errno()); return false; } } mysql_query("SET NAMES 'ujis'",$this->conn); ←追加 return true;
http://bowz.info/1065
あとは細かいパーミッションやパスの変更をしたりしておしまい。
CORESERVERははやいとここのMySQLの文字コードまわりの設定をきちんとしてほしいなー。