MariaDB中不同Unicode中文字符被误判为重复的查询问题
问题原因与解决方案
问题原因
你遇到的问题根源在于utf8mb4_unicode_ci排序规则的等价映射特性:这个排序规则会将部分视觉或语义相近但Unicode码点不同的字符判定为等价(即使它们的码值如U+2E8C和U+2E8D完全不同)。MariaDB 10.3使用的是旧版本的Unicode Collation Algorithm (UCA),其中包含这类字符的等价分组逻辑,导致分组查询时它们被视为重复,WHERE条件查询也会同时命中多个不同字符的记录。
正确查询方法
1. 临时指定二进制排序规则精准匹配
在查询时显式指定utf8mb4_bin排序规则,它会严格按照Unicode码点的二进制值进行比较,完全区分不同码点的字符:
-- 精准查询⺌(U+2E8C) SELECT * FROM radicalAlt WHERE radicalAlt = '⺌' COLLATE utf8mb4_bin; -- 分组查询时区分不同码点字符 SELECT radicalAlt, COUNT(*) FROM radicalAlt GROUP BY radicalAlt COLLATE utf8mb4_bin;
2. 通过Unicode码点直接匹配
使用ORD()函数获取字符的十进制码值,或者直接用十六进制码值进行匹配,彻底绕开排序规则的影响:
-- 用十进制码值查询(U+2E8C的十进制是11916) SELECT * FROM radicalAlt WHERE ORD(radicalAlt) = 11916; -- 用十六进制码值查询 SELECT * FROM radicalAlt WHERE radicalAlt = UNHEX('2E8C');
3. 调整表字段的排序规则(永久方案)
如果你的业务场景需要长期精准区分这类字符,可以修改radicalAlt字段的排序规则为utf8mb4_bin:
ALTER TABLE radicalAlt MODIFY COLUMN radicalAlt VARCHAR(...) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
注意:修改字段排序规则后,所有针对该字段的查询都会严格按码点比较,需要评估对现有业务的影响。
4. 升级MariaDB版本(可选)
MariaDB 10.5及以上版本使用了更新的UCA版本,部分字符的等价映射规则已调整。如果允许升级数据库,新版本可能默认就能区分这类字符,但升级前务必做好数据备份和兼容性测试。
内容的提问来源于stack exchange,提问作者Usaginomimi
相关产品推荐
相关产品推荐

