MySQL WHERE `character` = 'a' 匹配 a、A、à 等。为什么?

标签 mysql unicode multibyte

我在 MySQL 中有以下查询:

SELECT id FROM unicode WHERE `character` = 'a'

unicode 包含每个 unicode 字符以及一个 ID(它是整数编码值)。由于表的排序规则设置为 utf8_unicode_ci,我预计上述查询仅返回 97(字母“a”)。相反,它返回 119 行,其中包含许多类似“a”的字母的 ID:

a A ...

它似乎忽略了大小写和字符的多字节性质。

有什么想法吗?

最佳答案

Unicode Character Sets 下所述:

MySQL implements the xxx_unicode_ci collations according to the Unicode Collation Algorithm (UCA) described at http://www.unicode.org/reports/tr10/. The collation uses the version-4.0.0 UCA weight keys: http://www.unicode.org/Public/UCA/4.0.0/allkeys-4.0.0.txt.

full collation chart清楚地表明,在此排序规则中,基本字母的大多数变体都是等效的,无论其字母大小写或重音/装饰如何。

如果您只想匹配精确的字母,则应使用二进制排序规则,例如 utf8_bin

关于MySQL WHERE `character` = 'a' 匹配 a、A、à 等。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12431887/

相关文章:

c++ - 如何在c/c++控制台程序中正常输出多字节字符?

php - 如何检查 MySQL JSON 列是否不包含 laravel 中的值?

mysql - 如何更改mysql中的数据库排序规则

用于匹配包含非 anchor 标记的字段的 mysql regexp 以及包含模式的 href 属性

c++ - eclipse CDT : 'can' t find a source file' while debugging

python - 为什么 `' ↊'.isnumeric()` 是假的?

mysql - UTF-8字符有问题;我看到的不是我存储的

c - 终止(可能)多字节字符串?

如果使用 TIMESTAMPDIFF 第二个参数为 NULL,MySQL 如何获取时差?