LoginSignup
3
0

MySQL 8.0.30 のutf8mb3で記録されないはずの文字列の怪奇現象

Posted at

これなに

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を見てびっくりしたということ。

どうせ作った側の会社に聞いても調べる能力はないだろうし・・(多分デフォルトでやっている)これが開発終盤で爆発しないことを祈ることしかできないのか・・・

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0