2022-02-15 MySQLにおけるutf8はutf8mb3 / MySQL 5.6における異体字
MySQLにおけるutf8はutf8mb3
MySQLがいう utf8 は真のutf8ではない!という話。
utf8
→ 1~3バイトまで対応utf8mb4
→ 1~4バイトまで対応
utf8mb3 文字セットには、次の特性があります:
- BMP 文字のみをサポート (補助文字はサポートされません)
- マルチバイト文字ごとに最大 3 バイトが必要です。
utf8 は utf8mb3 のエイリアスです。
MySQL :: MySQL 8.0 リファレンスマニュアル :: 10.9.2 utf8mb3 文字セット (3 バイトの UTF-8 Unicode エンコーディング)
MySQL 5.6における異体字
古いDB(MySQL 5.6)を触って下記と全く同じ事象にでくわした。
16進表現で0x79b0と0xe0100の2文字で構成されていることがわかりました。0xe0100を調べてみると、これは異体字セレクタというもののようです。
したがって、禰󠄀を格納しようとすると、4byteである異体字セレクタのみ欠落して格納されてしまう
UTF-8のテーブル(MySQL5.6)に竈門禰󠄀豆子が格納できない問題を調べてみた - Qiita
?
とかに変換されるのではなくデータが消える、というのがなかなかやっかいなやつ。
異体字とは
日本語には、文字の意味と読みが同じ漢字がいくつも存在します。そのようなとき、標準的な文字に対して、字体の異なる文字のことを「異体字」と言います。
異体字 | フォント用語集 | 文字の手帖 | 株式会社モリサワ
異体字セレクタ
異体字セレクタ (英: Variation Selector) は、Unicode および ISO/IEC 10646 (UCS) における、文字の字体をより詳細に指定するためのセレクタ (選択子) である。