RDSに作成したMySqlのDatabaseに日本語が登録出来ない問題

mysql MySQL
aws AWS
rds RDS

問題

AWSのRDSにMySQLのインスタンスを作成し、RailsからDBを作成した際に、日本語が文字化けしていた。

RDSは下記の手順で作成していた

  1. インスタンスの作成
  2. パラメータグループの作成し、下記の項目にutf8を選択
    • character_set_client
    • character_set_connection
    • character_set_database
    • character_set_results
    • character_set_results
  3. 作成したインスタンスのパラメータグループを2.で作成したパラメータグループに変更
  4. インスタンスの再起動 これで日本語対応完了と思っていた。

実際に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-handshake1を設定する。
その後、インスタンスの作成時、パラメータグループに作成したパラメータグループを選択するようにすると、
インスタンス作成時に、character_set_databaseがutf8で作成される。

次回設定するときは、先にパラメータグループを作成してからインスタンスを作成しよう。。。