【Aurora RDS】文字化けを修正したので、その原因と解決方法をまとめた
Aurora RDSのテーブル内のデータの一部で文字化けが発生してしまい、その修正を行ったのでその原因と解決方法をまとめました!
発生事象
Aurora RDSのテーブルにおいて文字化けが発生。
テーブルの中身をみると ????
に文字化けしていた。
原因
utf8
と utf8mb4
で設定が揺れていたため。
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
について
selectは utf8
今回の問題が発生したバリデーションの処理でも、APIでも utf8
になっていた。
まとめるとこんな感じ
何が起きていたのか
utf8
と utf8mb4
の違いは、
utf8は文字を1〜3バイトで表現する。 utf8mb4は文字を1〜4バイトで表現する。
MySQLのutf8とutf8mb4の違いを実際に🍣(スシ)をINSERTして検証する | Playful IT - Designing and Engineering "遊び心"駆動開発 より
4バイトの文字を utf8
でエンコードすると、1バイト欠損してしまう。
解決方法
utf8mb4
に統一することで文字化けを解決。