概要
RDSのパラメータグループで、文字セットをutf8mb4にしたのに、4バイト文字を連携すると「????」と表示されてしまいました。
解決方法を紹介します。
前提とエラー内容
RDSのエンジンバージョンについては、Aurora3のmysql8.0を利用。
Clusterのパラメータグループにて、以下はすべてutf8mb4にしました。
character_set_client
character_set_connection
character_set_database
character_set_filesystem
character_set_results
character_set_server
RDSデータベースの方を確認しても、DB自体やテーブルもそれぞれutf8mb4になっていました。
ここでアプリを通して4バイトの特殊文字などを連携すると「????」と返されてしまいます。
4バイト文字とは、絵文字や一部の旧字体などが該当し、utf8mb4文字セットではこれらを含むすべてのUnicode文字をサポートしています。本来ならば、正常に表示されるべきです。
解決方法
原因は、パラメータグループのskip-character-set-client-handshake
にありました。
公式ドキュメントはこちら。
クライアントによって送信された文字セット情報を無視しません。 クライアント情報を無視して、サーバーのデフォルトの文字セットを使用するには、--skip-character-set-client-handshake を使用します。これにより、MySQL は MySQL 4.0. のように動作します。
ここがデフォルトのままだと「-」と表示されており、これだと、Mysqlサーバはクライアントから送信された文字セット情報を無視し、サーバー側のデフォルト文字セットを使用する、という意味になります。
これが原因で、クライアントとサーバ間で文字セットの不一致が発生し、4バイト文字(絵文字や一部の旧字体など)が正しく処理されず、「????」と表示されたと考えられます。
そこで、この値を1
にすると、サーバはクライアントから送信された文字セット情報を認識し、クライアントとサーバ間で文字セットが一致するようになりました。結果、旧字体も正常に出力されるようになりました。