【Aurora RDS】文字化けを修正したので、その原因と解決方法をまとめた

Aurora RDSのテーブル内のデータの一部で文字化けが発生してしまい、その修正を行ったのでその原因と解決方法をまとめました!

発生事象

Aurora RDSのテーブルにおいて文字化けが発生。
テーブルの中身をみると ???? に文字化けしていた。

原因

utf8utf8mb4 で設定が揺れていたため。

insertは utf8

文字化けの発生したテーブルに対して、毎日データ更新を行うバッチ処理が実行されている。
その際、utf8エンコードしてテーブルに書き込んでいた。

    engine = create_engine(
        myDB,
        connect_args={'charset': 'utf8'},
        pool_recycle=25200,
    )

RDSクラスターは utf8mb4

一方RDSのクラスターのパラメータでは、utf8mb4 に設定されていた。
(というよりも utf8 は設定できない模様)

show variables like 'char%'

そのため、テーブルも utf8mb4 で作成されている。

show create table hogehoge
CREATE TABLE `hogehoge` ( 略 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

utf8mb4 について

techracho.bpsinc.jp

selectは utf8

今回の問題が発生したバリデーションの処理でも、APIでも utf8 になっていた。

まとめるとこんな感じ

f:id:hesma2:20210417121353p:plain

何が起きていたのか

utf8utf8mb4 の違いは、

utf8は文字を1〜3バイトで表現する。 utf8mb4は文字を1〜4バイトで表現する。
MySQLのutf8とutf8mb4の違いを実際に🍣(スシ)をINSERTして検証する | Playful IT - Designing and Engineering "遊び心"駆動開発 より

4バイトの文字を utf8エンコードすると、1バイト欠損してしまう。

解決方法

utf8mb4 に統一することで文字化けを解決。

f:id:hesma2:20210417121450p:plain

参考

qiita.com

pando.life