●問題概要:
使用中(中身あり)のDB文字コードはlatin1で、UTF8文字コードのDBに移行したい。
●問題詳細:
Mysqlのデータベースをデフォルトのままで使用してきたため、文字コードは以下のようになっていた。この状態(サーバとクライアントの文字コード不一致)でも問題なく、日本語を入力・検索などできていた。
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 | latin1 ←ここ |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
つぎ、新しいDBを別のサーバ上に作成した。
せっかくだから、最近はサーバもクライアントもUTF8に揃うように使っているのは、普通だ。
というのは、揃わないと、途中に一回文字コード変換を経て表示されるため、
すべて全部文字化けしないということは保証できない。
クライアント側文字コード --> Unicode(ucs2) --> サーバ側文字コード
サーバ側文字コード --> Unicode(ucs2) --> クライアント側文字コード
新しいDBの環境変数は、以下に設定している。
mysql> show variables like 'char%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 ←ここ |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 ←ここ |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
設定方法は以下になる。
# mysql --version ←バージョンは以下だ。
mysql Ver 14.14 Distrib 5.6.24, for Linux (x86_64) using EditLine wrapper
# rpm -qa | grep mysql ←入っているパッケージは以下だ。
mysql-connector-python-2.0.4-1.el7.noarch
mysql-community-common-5.6.24-3.el7.x86_64
mysql-community-libs-5.6.24-3.el7.x86_64
mysql-community-server-5.6.24-3.el7.x86_64
mysql-community-release-el7-5.noarch
mysql-community-client-5.6.24-3.el7.x86_64
mysql-community-devel-5.6.24-3.el7.x86_64
mysql-utilities-1.5.4-1.el7.noarch
# vi /etc/my.cnf ←定義に以下の赤字部分を追記して、mysqlサービスを再起動する。
(再起動は# systemctl restart mysql)
------------------------
character-set-server = utf8
[client]
default-character-set = utf8
[mysqldump]
default-character-set = utf8
[mysql]
default-character-set = utf8
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
------------------------
●解決策
今回はDBの移行なので、「元DBダンプ→文字コード変更→ターゲットDBにインポート」という順番になる。
(1)まずは、移行元DBをダンプ出力する。ここのポイントは、文字化けをしないように、元DBのサーバ文字コードに合わせてダンプすること。
# mysqldump -u username -ppassword --default-character-set=latin1 databasename > dump.db
※dump.dbはテキストファイルなので、viエディタで文字化けしているかどうかを確認できる。
(2)ダンプファイルを別ファイルにコピーする
# cp -p dump.db dump_utf8.db
(3)ダンプファイル中の文字コード記述を変更する
# vi dump_utf8.db
/*!40101 SET NAMES latin1 */;
↓
/*!40101 SET NAMES utf8 */;
(4)
# mysql -u username -ppassword databasename2 < dump_utf8.db
※データベース名は気をつけること。元のDBに間違ってインポートしたら上書きされる。
以上で、移行完成です。
ちょっと気持ちスッキリだ!(笑)