我在 MySQL 中有以下查询:
SELECT id FROM unicode WHERE `character` = 'a'
该表unicode
包含每个 unicode 字符以及一个 ID(它是整数编码值)。由于表的排序规则设置为 utf8_unicode_ci,因此我预计上述查询仅返回 97(字母“a”)。相反,它返回 119 行,其中包含许多类似“a”的字母的 ID:
一个阿...
它似乎忽略了字符的大小写和多字节性质。
有任何想法吗?
MySQL
xxx_unicode_ci
根据http://www.unicode.org/reports/tr10/中描述的 Unicode Collation Algorithm (UCA) 实现排序规则。排序规则使用版本 4.0.0 UCA 权重键:http ://www.unicode.org/Public/UCA/4.0.0/allkeys-4.0.0.txt 。
完整的排序规则表清楚地表明,在这种排序规则中,基本字母的大多数变体都是等效的,无论它们的字母大小写或重音/装饰如何。
如果您只想匹配精确的字母,您应该使用二进制排序规则,例如utf8_bin
.
表格的整理是问题的一部分;带有 _ci 排序规则的 MySQL 将所有这些 'a' 视为相同字符的变体。
切换到 _cs 排序规则将强制引擎区分 'a' 和 'A',以及 'á' 和 'Á',但它仍可能将 'a' 和 'á' 视为同一个字符。
如果您需要精确的比较语义,完全不考虑相似字符的等价性,您可以使用BINARY
比较运算符
SELECT id FROM unicode WHERE BINARY character = 'a'
排序规则中的ci
表示不区分大小写。切换到区分大小写的排序规则 ( cs
) 以获得您正在寻找的结果。