mysql 同形异义字REGEX检测和sql排序规则

juud5qan  于 2022-10-31  发布在  Mysql
关注(0)|答案(1)|浏览(113)

我有一个包含一些正则表达式的表。默认情况下,该表是使用utf8mb4_general_ci排序规则创建的。一切都很好,直到我尝试添加一个包含同音字的正则表达式,如this one。正则表达式/𝑪𝑹𝒀𝑷𝑻𝑶/一旦存储在我的数据库中,将永远不会匹配。
是什么导致了这种行为?我怀疑mysql表行排序规则出错了。如果是这样,应该使用什么排序规则来修复这个问题?
更改排序规则是否会影响我已经存储在该表中的其他正则表达式(超过3 k,但纯文本,没有同音异义字)?

smdncfj3

smdncfj31#

可以创建一个COLLATION来平等地对待同音字,但我不认为MySQL中存在这种情况。
我尝试使用默认排序规则:

42           66=x0042  [B]    L  LATIN CAPITAL LETTER B
CE92        914=x0392  [Β]    L  GREEK CAPITAL LETTER BETA
D092       1042=x0412  [В]    L  CYRILLIC CAPITAL LETTER VE

并且得到了

SELECT 'Β' = 'B' AS 'beta:b', 'B' = 'В' AS 'b:Ve';
+--------+------+
| beta:b | b:Ve |
+--------+------+
|      0 |    0 |
+--------+------+

MySQL 8.0更新了它的regexp处理器以处理utf8mb4,因此现在

mysql> SELECT 'Β' RLIKE '[ΒBВ]';
+----------------------+
| 'Β' RLIKE '[ΒBВ]'    |
+----------------------+
|                    1 |
+----------------------+

因此,使用一组“字符类”,您可以构建一个正则表达式来检查任何类似于B的集合,从而检查类似于CRYPTO的集合。

相关问题