Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

問題

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で作成される。

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

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away