強欲で謙虚なツボツボ

趣味の読書の書の方

【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}

これで完了。

 

おしまい

データベースのエンコードとかタイムゾーンみたいなパラメータの設定は、データベース作成前にきちんとやっておくといい。

後からやるとデータベースを再作成しないといけないから面倒。