使用NCHAR的SQL LIKE返回不应出现的记录,原因是什么?
为何不含窄不换行空格的记录会被LIKE语句匹配到?
这是因为SQL Server的排序规则对Unicode字符的权重处理导致的:
- 窄不换行空格(U+202F,
NCHAR(8239))在多数常用排序规则(如SQL_Latin1_General_CP1_CI_AS、Latin1_General_CI_AS)中,被归类为「无权重可忽略」字符。 - LIKE匹配操作是基于字符的权重而非原始编码进行比较的。当目标字符被标记为无权重时,
%+ 该字符 +%等价于通配符%%,会匹配所有非空字符串,因此第三条没有U+202F的记录也被返回。
验证与解决办法
验证严格匹配
使用二进制排序规则强制按编码比较,此时只会返回前两条目标记录:SELECT * FROM @tst WHERE col COLLATE Latin1_General_BIN LIKE N'%' + NCHAR(8239) + N'%'严格匹配的解决方式
- 显式指定二进制排序规则:在LIKE条件中添加
COLLATE子句,使用如Latin1_General_BIN、UTF8_BIN等二进制排序规则。 - 使用CHARINDEX函数:该函数默认基于二进制编码比较,无需额外指定排序规则即可精准匹配:
SELECT * FROM @tst WHERE CHARINDEX(NCHAR(8239), col) > 0
- 显式指定二进制排序规则:在LIKE条件中添加
内容的提问来源于stack exchange,提问作者igorjrr
相关产品推荐
相关产品推荐

