Edited at

RDSで日本語が文字化けする問題

More than 5 years have passed since last update.

RDSではDefaultでcharacter-setにlatin1が割り当てられる為、日本語を利用する際はutf8などに変更してあげる必要がある。


Step1

RDSダッシュボードの左メニューからParameter Groupsを選択する。

Create DB Parameter Groupを選択し、


  • DB Parameter Group Family

  • DB Parameter Group Name

  • DB Parameter Group Description

をそれぞれ選択し、設定を行うDBの種類、パラメータグループの名前と説明を入力し、"Yes, Create"で作成


Step2

パラメータグループが出来たことを確認したら、作成したグループの詳細ページからEdit Parametersを選択し、


  • character_set_client

  • character_set_connection

  • character_set_database

  • character_set_results

  • character_set_server

これらを utf8 に設定

ただ、これだけだとデータベースの一部が latin1 から変わらない問題が生じてしまうので


  • skip-character-set-client-handshake

のパラメータを1に設定

変更を加えたら"Save Changes"をクリックして変更を保存する


Step3

まだインスタンスを立ち上げてない場合は"Launch DB Instance"で新規インスタンスを立ち上げ、Parameter Groupに先ほど作成したグループを指定する。

すでにインスタンスが立ち上がっている場合は"modify"を選択して、Parameter Groupを変更してSaveする。

既に立ち上がっているインスタンスのパラメータグループを変更した際は"Configuration Details"の"Parameter Group"が pending-reboot となるので"Instance Actionからreboot"を選択し、インスタンスを再起動する。

その際に数分間インスタンスが止まるのでタイミングを見計らってから行うとよい


Step4

インスタンスの再起動を行ったらコマンドラインからmysqlに接続してcharsetが変わっているか確認する

% mysql -u ユーザー名 -p -h xxx.xxxxxxxxxx.ap-northeast-1.rds.amazonaws.com データベース名

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 | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /rdsdbbin/mysql-5.6.17.R1/share/charsets/ |
+--------------------------+-------------------------------------------+

このようにutf8になっていることを確認できたら完了


追記

既存テーブルのcharsetが



SHOW CREATE TABLE テーブル名



を行った時に

+------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

| Table | Create Table |
+------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| テーブル名 | CREATE TABLE `テーブル名` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`created_at` datetime DEFAULT NULL,
`updated_at` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.05 sec)

のようにlatin1から変わってない時があるので、DROP TABLEをして作り直すか、

ALTER TABLE テーブル名 CONVERT TO CHARACTER SET UTF8

としてUTF8に変えてあげるとよい