自宅サーバからCORESERVERへのXOOPS移行手順

意外と手間取ったので記録しておく。
まず、データベースの文字コードの状況を確認する。

自宅サーバ側
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の文字コードまわりの設定をきちんとしてほしいなー。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です