RDS(Aurora)で文字コード設定をutf8mb4にする

RDS(Aurora)にあるデータベースの文字コードを、utf8からutf8mb4へ変更したので、そのときに学んだことや手順のメモです。以下の手順をおこないます。

  • RDSの設定をutf8mb4にする
  • クライアント側(今回はSpring Bootのアプリケーション)の設定を行う

RDSの設定

RDSのパラメータグループの設定を行います。以下の設定を、クラスターのパラメータグループにたいして入れればOK。

character_set_client:utf8mb4
character_set_connection:utf8mb4
character_set_database:utf8mb4
character_set_results:utf8mb4
character_set_server:utf8mb4

検索していると、indexを張ろうとしたときに問題があるからファイルフォーマットをBarracudaにする、など他の設定の情報も出てくるのですが、MySQL5.7.9以降では問題にならないようです(ファイルフォーマットがデフォルトでBarracudaになるため)。以下リンク先のページにわかりやすくまとまっています。

参考

パラメータグループの設定ができたら、クライアントから確認してみましょう。

mysql> show variables like "chara%";
+--------------------------+-------------------------------------------------+
| Variable_name            | Value                                           |
+--------------------------+-------------------------------------------------+
| character_set_client     | utf8                                            |
| character_set_connection | utf8                                            |
| character_set_database   | utf8mb4                                         |
| character_set_filesystem | binary                                          |
| character_set_results    | utf8                                            |
| character_set_server     | utf8mb4                                         |
| character_set_system     | utf8                                            |
| character_sets_dir       | /xxxxxxx/xxxxxxx/share/charsets/ |
+--------------------------+-------------------------------------------------+
8 rows in set (0.00 sec)

character_set_client, character_set_connection, character_set_results の値はクライアント側の設定によるので、一旦気にしなくて大丈夫です。また、character_set_system は、システムで使用する文字コードで変更はできないため、utf8のままで問題ありません。

クライアント(Spring Bootアプリケーション) の設定

Connector/Jの公式ドキュメントを見ながら進めていきます。

雑な翻訳ですが、以下のような感じでしょうか……。


  1. サーバー設定を character_set_server=utf8mb4 にする
  2. characterEncoding と connectionCollation を接続文字列から除外する

これらの手順を行うことで、Connector/JがUTF-8の設定を自動検出して使用できる


また、Connector/J のバージョンによっても挙動が異なる部分があるようなので、念のためドキュメントの続きの部分も確認しておきましょう。


Connector/J 5.1.46 以前のバージョンを使用している場合

utf8mb4を使うには、サーバーは必ず character_set_server=utf8mb4; で設定されていなければいけない その設定がされていなく、characterEncodingUTF-8 が指定された場合、MySQLの接続には utf8 が設定される(utf8mb3エイリアス)

Connector/J 5.1.47 以降のバージョンを使用している場合

characterEncodingUTF-8 が指定された場合、utf8mb4 を意味する


characterEncodingに同じ値が設定されていても、バージョンにより解釈が異なるのですね。

私が使用していたConnector/Jはバージョン5.1.47以降だったので、設定としては、以下のように入れておけば大丈夫そうでした。

spring.datasource.url=jdbc:mysql://xxxxxx.xxxxxx.ap-northeast-1.rds.amazonaws.com:3306/db_name?characterEncoding=utf8

今回のブログは以上です!細かいところで地味にハマったのでどなたかのお役に立てば幸いです!

参考