为啥 MySQL 在使用带有通配符的 LIKE 运算符时会忽略假名敏感?

Posted

技术标签:

【中文标题】为啥 MySQL 在使用带有通配符的 LIKE 运算符时会忽略假名敏感?【英文标题】:Why does MySQL ignore kana-sensitive when using the LIKE operator with a wildcard?为什么 MySQL 在使用带有通配符的 LIKE 运算符时会忽略假名敏感? 【发布时间】:2021-12-10 06:07:21 【问题描述】:

当我搜索 LIKE %カナ 时,它仍然会显示 かな 的结果。

来自Language-Specific Collations 下的 mysql 文档(我在 8.0.26):

对于日语,utf8mb4 字符集包括 utf8mb4_ja_0900_as_csutf8mb4_ja_0900_as_cs_ks 排序规则。两种排序规则都区分重音并且 区分大小写。 utf8mb4_ja_0900_as_cs_ks 也是假名敏感和区分的 片假名字符来自平假名字符,而utf8mb4_ja_0900_as_cs 对待 片假名和平假名字符相等,便于排序。

检查我的专栏,它显示了对假名敏感的排序规则:

SELECT COLUMN_NAME, COLLATION_NAME FROM INFORMATION_SCHEMA.COLUMNS;
COLUMN_NAME COLLATION_NAME
kana utf8mb4_ja_0900_as_cs_ks

【问题讨论】:

【参考方案1】:

MySQL 使用三种(?)不同的代码进行字符比较:=LIKEREGEXP。令人困惑的是,它们并不完全相同。在某些情况下,它们是故意不同的。

s LIKE 'abc' 变成了s = 'abc',更加混乱了。

_as_cs 结尾的排序规则意味着'e' <> 'E',但无论<> 是否适用,仍然可以使用。这与 BINARY_bin 排序规则不同,在这种情况下,它会盲目检查位。

您使用的排序规则相对较新;它不早于 8.0。如果您在排序规则中发现错误,请在 bugs.mysql.com 提交错误报告并提供一个简单的测试用例来证明该问题。

【讨论】:

【参考方案2】:

如果区分大小写,请尝试使用 LIKE BINARY。

例子:

SELECT name FROM users WHERE name LIKE BINARY 'John%';

【讨论】:

请注意,我问的是假名敏感性。这可行,但我的问题是为什么它不能按原样使用 LIKE 和通配符,因为根据列排序规则,其中一个操作数对假名敏感。不使用LIKE 或删除通配符按预期工作。区分大小写的模拟测试也可以按预期工作,无需 BINARY 覆盖。

以上是关于为啥 MySQL 在使用带有通配符的 LIKE 运算符时会忽略假名敏感?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 C# 在 MS-Access 中的查询中使用带有通配符的 LIKE 运算符

MySQL中like使用 % 和 _ 的区别

MySQL like用法

mysql查询语句中like 的用法

mysql怎么用like检索字段中带有数字的语句?

08 使用通配符进行过滤 - like