サクラインターネットのレンタルサーバーをプラン変更したとき、古いデータベースサーバーから新しいデータベースサーバーにデータを移行する必要があった。古いデータを mysqladmin から sql ファイルとしてエクスポートして、新しいデータベースサーバーへはターミナルで接続して source コマンドでエクスポートした。
すると、いくつかあるテーブルの内、後半のテーブル内のデータが文字化けする現象に遭遇した。インポート中のターミナル画面を見ていると気になるエラー?を発見。
——————————————–
Query OK, 870 rows affected (0.02 sec)
Records: 870 Duplicates: 0 Warnings: 0
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect…
Query OK, 850 rows affected (0.02 sec)
Records: 850 Duplicates: 0 Warnings: 0
——————————————–
いったんデータベースサーバーへの接続が切断されて、その後再接続が行われている。そして、その再接続後から文字化けが起こっている?
このエラーは、インポートするデータが大きすぎると起こるらしい。
自分でいじれるサーバーであれば、max_allowed_packet の値を上げることで解決できるようだが(参考)、さくらの自分のプランでは、my.cnf をいじることができないため通用せず。
mysql の文字コードを確認してみる。
//コマンド
——————————-
mysql> show variables like “chara%”;
——————————-
+————————–+———————————-+
| 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/local/share/mysql/charsets/ |
+————————–+———————————-+
utf8 のデータだが、設定されている文字コードは ujis が多い。文字コードを変更する最も一般的な方法は my.cnf を書き換えることだが自分のプランではできない。ターミナルで mysqlサーバーへログインするときに 文字コードを指定してみる。
//ターミナルで文字コードを設定
——————————-
mysql -u ユーザー名 -p -h ホスト名 –default-character-set=utf8
——————————-
//設定後
+————————–+———————————-+
| Variable_name | Value |
+————————–+———————————-+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | ujis |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | ujis |
| character_set_system | utf8 |
| character_sets_dir | /usr/local/share/mysql/charsets/ |
+————————–+———————————-+
character_set_database は use でデータベースを選択すると、データベースの文字コードになる。
//最終的にこうなった
+————————–+———————————-+
| Variable_name | Value |
+————————–+———————————-+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | ujis |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | ujis |
| character_set_system | utf8 |
| character_sets_dir | /usr/local/share/mysql/charsets/ |
+————————–+———————————-+
この状態で sql ファイルを source で実行したら文字化けは起こらなかった。