SQL Server查询康熙部首异常:返回全量部首而非单条结果求助
问题原因与解决方案
核心原因
SQL Server的多数排序规则(包括你测试的默认规则和Japanese_Unicode_CI_AI_KS_WS)对**CJK Radicals Supplement Unicode区块(U+2E80至U+2EFF)**内的康熙部首字符,赋予了完全相同的排序权重。这就导致当你用=进行等值比较时,SQL Server会认为该区块内所有字符都是“相等”的,因此返回所有康熙部首记录。
而普通日文汉字(比如炎)属于CJK Unified Ideographs区块,每个字符都有独立的排序权重,所以能正常精确匹配单行结果。
验证方法
你可以通过以下查询验证权重等效性:
-- 对比两个不同康熙部首的等值判断 SELECT CASE WHEN N'⺉' COLLATE Japanese_Unicode_CI_AI_KS_WS = N'⺌' THEN '相等' ELSE '不等' END AS Result; -- 查看字符的Unicode码点(确认是不同字符) SELECT UNICODE(N'⺉') AS CodePoint1, UNICODE(N'⺌') AS CodePoint2;
执行后会发现,两个不同码点的康熙部首会被判定为“相等”。
解决方案
要实现康熙部首的精确匹配,需要使用二进制排序规则,这类规则会严格按照字符的Unicode码点进行比较,而非排序权重:
- 临时在查询中指定排序规则:
select * from Kanji where Character = N'⺉' COLLATE Unicode_BIN2;
- 长期方案:修改表列的排序规则(如果业务允许):
ALTER TABLE Kanji ALTER COLUMN Character NVARCHAR(1) COLLATE Unicode_BIN2 NOT NULL;
内容的提问来源于stack exchange,提问作者Ger
相关产品推荐
相关产品推荐

