GA

2018/10/24

utf8mb4_0900_ai_ciは "=" と "≠" を同じ文字だと思っている

TL;DR


MySQL 8.0の utf8mb4 のデフォルト照合順序として utf8mb4_0900_ai_ci というのがあって( default_collation_for_utf8mb4 で多少は変えられる)、これは kamipoのハハ=パパ問題 を引き起こす照合順序として日本人には知られている(と思う。といいな。広まれ!)
で、その utf8mb4_0900_ai_ci が今度はイコール=ノットイコール問題を発症したらしい。
mysql80 34> SELECT '=' = '≠';
+-------------+
| '=' = '≠'   |
+-------------+
|           1 |
+-------------+
1 row in set (0.00 sec)
…はは。
ちょっと気になって調べてみた感じ、どうもUCA準拠の照合順序では 最初っからそうだったっぽい
MySQL 5.0ですらこれは引っ掛かる。
mysql50> SELECT '=' = '≠' COLLATE utf8_unicode_ci;
+-------------------------------------+
| '=' = '≠' COLLATE utf8_unicode_ci   |
+-------------------------------------+
|                                   1 |
+-------------------------------------+
1 row in set (0.00 sec)

mysql50> SELECT '=' = '≠' COLLATE utf8_general_ci;
+-------------------------------------+
| '=' = '≠' COLLATE utf8_general_ci   |
+-------------------------------------+
|                                   0 |
+-------------------------------------+
1 row in set (0.00 sec)
今まで暗黙のデフォルトが「引っ掛からない」方だったから気にならなかった、というだけのアレだったようですね。
ちなみにどんな文字が同一視されるか、については 日本MySQLユーザ会 の代表えもんこと @tmtms さんがかなり昔にまとめてくれていましたね。
ありがたやありがたや(*-人-)

0 件のコメント :

コメントを投稿