MySQLにおけるutf8はutf8mb3

MySQLがいう utf8 は真のutf8ではない!という話。

  • utf8 → 1~3バイトまで対応
  • utf8mb4 → 1~4バイトまで対応

utf8とutf8mb4の違い【MySQL】

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) における、文字の字体をより詳細に指定するためのセレクタ (選択子) である。

異体字セレクタ - Wikipedia