問題
AWSのRDSにMySQLのインスタンスを作成し、RailsからDBを作成した際に、日本語が文字化けしていた。
RDSは下記の手順で作成していた
- インスタンスの作成
- パラメータグループの作成し、下記の項目にutf8を選択
- character_set_client
- character_set_connection
- character_set_database
- character_set_results
- character_set_results
- 作成したインスタンスのパラメータグループを2.で作成したパラメータグループに変更
- インスタンスの再起動
これで日本語対応完了と思っていた。
実際にRailsのアプリからデータを投入すると、投入したデータの日本語が文字化けしている。
EC2にSSHで接続し、EC2からRDSにmysqlCommandでアクセスしてDBの状態を確認する。
mysql -h エンドポイント -P Port -u ユーザ名 -p データベース名
アクセス出来たらshow variables like 'char%';
で確認
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 | /rdsdbbin/mysql-5.7.11.R1/share/charsets/ |
+--------------------------+-------------------------------------------+
8 rows in set (0.01 sec)
mysql>
character_set_databaseがlatin1
になっている!?
インスタンスを作成する際に読み込んだパラメータグループがデフォルトであったため、再起動しても、databaseの文字コードは新しい設定になっていない模様。。。
解決策
下記のコマンドを実行してdatabaseの文字コードを修正
mysql> ALTER DATABASE データベース名 default character set utf8;
Query OK, 1 row affected (0.01 sec)
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 | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /rdsdbbin/mysql-5.7.11.R1/share/charsets/ |
+--------------------------+-------------------------------------------+
8 rows in set (0.01 sec)
mysql>
すでにテーブルも作成している場合、テーブルの文字コードも変更する必要がある
ALTER TABLE テーブル名 CONVERT TO CHARACTER SET UTF8
RDSのインスタンス作成時に対応する
なお、インスタンスを作成する前にパラメータグループを作成し、utf8の設定と一緒にskip-character-set-client-handshake
に1
を設定する。
その後、インスタンスの作成時、パラメータグループに作成したパラメータグループを選択するようにすると、
インスタンス作成時に、character_set_database
がutf8で作成される。
次回設定するときは、先にパラメータグループを作成してからインスタンスを作成しよう。。。