You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 07:31:07