【Aurora MySQL】日本語対応
概要
AWS RDSでAurora MySQLを選択してデータベースを作成した。
Railsとかでmigration実行をしてテーブルも作成した後、データ挿入を行うと日本語が全て???で保存されていた。
ちゃんと日本語で保存されるように頑張る。
具体的には、AWSのコンソールでパラメータグループを作成するのと、mysqldumpで作成済のデータベースやテーブルのエンコードを再設定する。
元の状態
パラメータ
Aurora MySQLはデフォルトでパラメータが以下のように設定される。
show variables like '%char%';
- 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
latin1なので日本語に対応できずに???となってしまう。
今回はパラメータグループの設定によって、filesystem以外をutf8mb4に変更する。(mb4は絵文字とかにも対応できる)
作成済テーブルのエンコード
show create database {データベース名} show create table {テーブル名}
出力される情報の末尾に、DEFAULT CHARACTER SET latin1
と表示される。
今回はデータベースを削除して再作成することで、DEFAULT CHARACTER SET utfmb4
となるように変更する。
パラメータグループの作成と設定
コンソールから「Create paramter group」で作成
- Parameter group family: aurora-mysql5.7(各自のDBに合わせる)を選択
- Type: DB Cluster Parameter Groupを選択
作成したパラメータグループを「Edit parameters」で編集する。
編集後は「Save changes」で保存。
- character_set_client: utf8mb4
- character_set_connection: utf8mb4
- character_set_database: utf8mb4
- character_set_results: utf8mb4
- character_set_server: utf8mb4
- collation_connection: utf8mb4_bin
- collation_server: utf8mb4_bin
- skip-character-set-client-handshake: 1
作成したパラメータグループを設定するためDBクラスターを「Modify」で編集。
Additional configuration > Database options > DB cluster parameter groupで作成したパラメータグループを選択。
設定後にDBクラスターに所属するDBインスタンスを「Reboot」して設定を反映。
これで、以後作成されるデータベースとテーブルは大丈夫。
作成済のデータベースとテーブルのエンコードを変更
DBの踏み台にしているEC2インスタンスへssh接続したのち、mysqldumpを実行。
mysqldump -u {USER_NAME} -p -h {HOST_NAME} {DB_NAME} > {OUTPUT_FILE_NAME}
出力された.sqlファイルを編集したいが、編集作業はローカルの方が楽なのでローカルへコピーする。
scp -i {鍵ファイル} {ec2-user}@xxx.xxx.xxx.xxx:{OUTPUT_FILE_NAME} ./
OUTPUT_FILEのlatin1とutf8となっている箇所を全てutf8mb4へ置換して、EC2インスタンスへコピーする。
scp -i {鍵ファイル} ./{OUTPUT_FILE_NAME} {ec2-user}@xxx.xxx.xxx.xxx:./
EC2インスタンスからDBへ接続し、データベースを削除する。
mysql -u {USER_NAME} -p -h {HOST_NAME} drop database {DB_NAME}; quit;
EC2インスタンスから編集後の.sqlファイルを適用してデータベースを作成する。
mysql -u {USER_NAME} -p -h {HOST_NAME} {DB_NAME} < {OUTPUT_FILE_NAME}
これで完了。
おしまい
データベースのエンコードとかタイムゾーンみたいなパラメータの設定は、データベース作成前にきちんとやっておくといい。
後からやるとデータベースを再作成しないといけないから面倒。