(古い記事) « XOOPS Cube と PHP5, MySQL5 の相性 | サイトTOP | スーパーボイジャーE 整備不良で墜落 » (新しい記事)
前回の日記XOOPS Cube と PHP5, MySQL5 の相性でも書いたが、新しいバージョンのOS、PHP、MySQLでXOOPSを再構築した時に、MySQL5でのDB作成時にどつぼにはまっていた。
とりあえずXOOPSの動作確認が取れた時のMySQLのデフォルトで作成した文字コードがlatin1のDBで、XOOPSの設定やコンテンツを登録したため、後になって問題が出てきた。
その問題とは、DBをバックアップ(ダンプ:mysqldump)した時に、ダンプファイルをテキストエディタで開くと、文字化けしているのである。無理矢理文字コードを変換すれば日本語で読める文字に直せるのだろうけど、今後の運用で問題となりそうなので、ujis(EUC-JP)へ変換(データマイグレーション)できないか調べてみた。
既に文字コードが latin1 で作成されたMySQLのDBを、構造と格納されているデータはそのまま、ujis(EUC-JP)に変換したいのだ。
ネットでこのようなMySQLの文字コードマイグレーションをされている方の情報を探す。
あんじーのテクニカルブログさんのサイトで、文字コードを変換する方法が紹介されていたので、この方法を試してみた。
1,DBをbinaryでダンプを取る。
2,ダンプファイル内のSQLでlatin1に指定されている構造部分のSQLをujisに手作業で変換する
3,ダンプファイルをujiでレストアする。
まず、現状のDBがどのような文字コード設定になっているかSQLを叩いて確認
mysql> show variables like '%char%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.02 sec)
フムフム。DBは確かに「latin1」で作られているみたい。
mysqldump --default-character-set=binary -u ユーザ名 DB名 --password=パスワード > ダンプの出力ファイルパス
出力されたダンプファイルをテキストエディタで開いて、charsetが指定されている箇所をlatin1からujisへ全て置換する。 次に、ujisに置換したダンプファイルからDBをレストアする。
mysql -u ユーザ名 -p DB名 --default-character-set=ujis < ダンプファイル名
mysql> show variables like '%char%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.01 sec)
alter database でキャラセットをujisに変更する。
mysql> alter database DB名 character set ujis;
Query OK, 1 row affected (0.00 sec)
構造を確認する。
mysql> show variables like '%char%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | ujis |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
databaseの文字コードがujisに変わっている。
MySQLの設定ファイル(/etc/my.cnf)の修正を行う。
[mysqld]
default-character-set=ujis
skip-character-set-client-handshake
を設定ファイルに追加して、MySQLを再起動する。
service mysqld start
再起動後のDBの構造を確認
mysql> show variables like '%char%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| 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/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
これで文字コードが latin1 だったMySQLのデータベースが、ujis(EUC-JP)のデータベースとして使用する事ができる。 これで元もとlatin1の文字コードだったDBをujis(EUC-JP)のDBへ移行する作業が完了。
2008/09/29 18:33
このエントリーのトラックバックURL:
http://www.wingnotes.net/mt/mt-tb.cgi/160
(古い記事) « XOOPS Cube と PHP5, MySQL5 の相性 | サイトTOP | スーパーボイジャーE 整備不良で墜落 » (新しい記事)