mysqlの文字化け

サーバ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)を参考にしました。