MySQL で、キャラクタセットを指定してデータベースをインポートする方法

MySQL で、データベースをテキストデータにエクスポート(バックアップ)する方法は、mysqldump コマンドを使えばよい。以下のようにする。

mysqldump -u root -p your_database_name > your_database_name.sql

さて、これを元に戻すときに、

mysql -u root -p your_database_name < your_database_name.sql

# your_database_name というデータベースの中身は空であること。

のようにすれば簡単にインポートできるのだが、エクスポート/インポートするそれぞれのマシンで違う設定の MySQL が動いていたりすると、インポートしてみたらデータが文字化けしてた・・・なんてことが実際にあった。 your_database_name.sql のキャラクタセットは UTF8 で書き出されているのに、単純に mysql コマンドでインポートしただけでは文字が化けてしまう。 まずはインポートする方のマシンの MySQL のキャラクタセットの設定を調べてみよう。コンソールから mysql コマンドでmysql にログインして、以下のコマンドを実行する。

mysql> <strong>SHOW VARIABLES LIKE 'character_set%';</strong>
+--------------------------+----------------------------+
| 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)

おやおやデフォルトがほとんど latin1 になっている。これでは utf8 で読み込んでくれそうにもない。そこで、

解決方法その1 以下のように --default-character-set=utf8 などと文字コード(キャラクタセット)を指定する。

mysql -u root -p --default-character-set=utf8 your_database_name < your_database_name.sql

解決方法その2 ほかにも phpMyAdmin からファイルをアップロードし、その際に文字コードを UTF8 にしてあげればよさそう。だけどこの方法だとアップロードのファイルサイズに制限があると少し大きめのデータベースのインポートは NG だ。root になれるなら、ファイルサイズの制限は php.ini の

php_value upload_max_filesize 2M

の 2M 部分を次のように修正するといいらしい。

php_value upload_max_filesize 8M

解決方法その3 root になれるなら MySQL のデフォルト文字コードを UTF-8 に変更する。 /etc/my.cnf か /etc/mysql/my.cnf を開き(ない場合は mysql が起動するときの設定ファイルを探す)、MySQLのデフォルト文字コードを UTF-8 に変更する。

vi /etc/my.cnf

my.cnf は以下のように変更する

[mysqld]
default-character-set = utf8

[mysql]
default-character-set = utf8

[mysqldump]
default-character-set = utf8