これなに
MySQLを5.6とか7の頃から触っているDB屋さんにとってちょっとした珍事というか謎、怪奇現象。
経緯
もともとAWS RDSでホスティングされていた MySQL 5.6 とか 7 というバージョンでは、4バイトのUTF-8エンコーディングされた文字列をDBに収めたかったら、utf8mb4
というエンコーディングを MySQLに指定する必要があった。
やらないと何が起こるかというと 𩸽
とか 髙
とか 﨑
とか 竈門禰󠄀豆子
とかINSERTできないか ???
になるかのどちらかだったように記憶している。
MySQL 8.0.30では何が起こっているかというと・・
3バイトまでしか記録できないはずの utf8mb3さんが4バイトの文字を記録している。
mysql> show variables like '%char%';
+--------------------------+-------------------------------------------+
| Variable_name | Value |
+--------------------------+-------------------------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | utf8mb3 |
| character_set_filesystem | utf8mb3 |
| character_set_results | latin1 |
| character_set_server | utf8mb3 |
| character_set_system | utf8mb3 |
| character_sets_dir | /rdsdbbin/mysql-8.0.30.R1/share/charsets/ |
+--------------------------+-------------------------------------------+
8 rows in set (0.09 sec)
mysql> select * from test_encoding;
+---------------------+
| font |
+---------------------+
| 髙 |
| 﨑 |
| 㐂 |
| 竈門禰󠄀豆子 |
| 𩸽 |
| 𪘚 |
+---------------------+
5 rows in set (0.10 sec)
ど、どういうことだってばよ・・ 保存できて・・いる?
MySQL 8.0.xx Changelog
8.0.11
Character Set Support
The utf8mb3 character set will be replaced by utf8mb4 in a future MySQL version. The utf8 character set is currently an alias for utf8mb3, but will at that point become a reference to utf8mb4. To avoid ambiguity about the meaning of utf8, consider specifying utf8mb4 explicitly for character set references instead of utf8. (WL #10778)
要約すると「utf8はutf8mb3のエイリアスだけどそのうちutf8mb4に置き換わるよ近い将来。」
そしてときは流れ。
8.0.31
Renamed internal Performance Schema functions from _utf8* to _utf8mb4* as they've used utf8mb4 since v8.0.11. (Bug #34351301)
v8.0.11 以降 utf8mb4 を使用しているため、内部パフォーマンス スキーマ関数の名前が _utf8 から _utf8mb4 に変更されました**
どういうこと?
8.0.11から30までのchangelogを斜め読みましたが、「置き換わったよ!」とかそんなこと書いてないように見える・・
つまりどこかのタイミングで utf8 = utf8mb3 = utf8mb4 になった?のか?
DBのエンコーディングはutf8mb3で問題ないよ!と言い切れなくてとても気持ちが悪い。
自分でDBを構築するときは過去にハマった経験から、必ずエンコーディングは utf8mb4
を指定していたんだけど、このたび他人が構築したDBを見てびっくりしたということ。
どうせ作った側の会社に聞いても調べる能力はないだろうし・・(多分デフォルトでやっている)これが開発終盤で爆発しないことを祈ることしかできないのか・・・