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

使用NCHAR的SQL LIKE返回不应出现的记录,原因是什么?

为何不含窄不换行空格的记录会被LIKE语句匹配到?

这是因为SQL Server的排序规则对Unicode字符的权重处理导致的:

  • 窄不换行空格(U+202F,NCHAR(8239))在多数常用排序规则(如SQL_Latin1_General_CP1_CI_AS、Latin1_General_CI_AS)中,被归类为「无权重可忽略」字符。
  • LIKE匹配操作是基于字符的权重而非原始编码进行比较的。当目标字符被标记为无权重时,% + 该字符 + % 等价于通配符%%,会匹配所有非空字符串,因此第三条没有U+202F的记录也被返回。

验证与解决办法

  1. 验证严格匹配
    使用二进制排序规则强制按编码比较,此时只会返回前两条目标记录:

    SELECT * FROM @tst WHERE col COLLATE Latin1_General_BIN LIKE N'%' + NCHAR(8239) + N'%'
    
  2. 严格匹配的解决方式

    • 显式指定二进制排序规则:在LIKE条件中添加COLLATE子句,使用如Latin1_General_BIN、UTF8_BIN等二进制排序规则。
    • 使用CHARINDEX函数:该函数默认基于二进制编码比较,无需额外指定排序规则即可精准匹配:
      SELECT * FROM @tst WHERE CHARINDEX(NCHAR(8239), col) > 0
      

内容的提问来源于stack exchange,提问作者igorjrr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 01:38:20