サーバAでmysqldumpしたデータをサーバBにインポートしたところ、文字化けしているのでこれをなんとかしたい。
MySQLのcharactersetの設定がlatin1なのに、データはutf8というのが問題らしいことはわかっている。
まず環境。サーバA。
OS: Ubuntu 7.04 Server
MySQL: 5.0.38
mysql> status; -------------- mysql Ver 14.12 Distrib 5.0.38, for pc-linux-gnu (x86_64) using readline 5.2 Connection id: 1193592 Current database: database Current user: user@localhost SSL: Not in use Current pager: less Using outfile: '' Using delimiter: ; Server version: 5.0.38-Ubuntu_0ubuntu1.4-log Ubuntu 7.04 distribution Protocol version: 10 Connection: Localhost via UNIX socket Server characterset: latin1 Db characterset: latin1 Client characterset: latin1 Conn. characterset: latin1 UNIX socket: /var/run/mysqld/mysqld.sock Uptime: 108 days 14 hours 27 min 32 sec Threads: 21 Questions: 115609420 Slow queries: 8 Opens: 146147 Flush tables: 1 Open tables: 64 Queries per second avg: 12.321 --------------
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.00 sec)
サーバB。
OS: Ubuntu 7.10 Server
MySQL: 5.0.
mysql&t; status; -------------- mysql Ver 14.12 Distrib 5.0.45, for pc-linux-gnu (x86_64) using readline 5.2 Connection id: 669 Current database: database Current user: user@localhost SSL: Not in use Current pager: stdout Using outfile: '' Using delimiter: ; Server version: 5.0.45-Debian_1ubuntu3.3-log Debian etch distribution Protocol version: 10 Connection: Localhost via UNIX socket Server characterset: utf8 Db characterset: utf8 Client characterset: utf8 Conn. characterset: utf8 UNIX socket: /var/run/mysqld/mysqld.sock Uptime: 1 day 5 hours 38 min 22 sec Threads: 4 Questions: 3166075 Slow queries: 2 Opens: 608 Flush tables: 1 Open tables: 64 Queries per second avg: 29.672 --------------
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.09 sec)
サーバBは、/etc/mysql/my.cnfで
[mysqld] default-character-set=utf8 skip-character-set-client-handshake [mysql] default-character-set=utf8
と設定している。
まず、サーバAからmysqldumpするとき--default-character-set=latin1を指定する。
$ mysqldump --default-character-set=latin1 -u user -p database > db.dump
db.dumpを開き、
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
となっている部分を
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
にする。
サーバBにインポートする。
$ mysql -u user -p database < db.dump
これにて問題解決。
ヽ( ・∀・)ノくまくまー(2006-10-11)を参考にしました。