【问题标题】:Narrow No-Break Space Comparison Failing in SQL ServerSQL Server 中狭窄的不间断空间比较失败
【发布时间】:2017-10-26 00:56:38
【问题描述】:

至少在 SQL Server 2012 和 2016 中,在相等比较中会忽略窄无分隔符空格字符(NNBSP、Unicode 8239)。例如,采用以下两个查询,它们比较字符串“AB”和“A   B”。第一个有“正常”,ASCII字符32个空格;第二个使用 NNBSP。

-- Do not equal, as expected
SELECT *
  FROM (SELECT N'AB' NoSpaces) NoSpaces,
       (SELECT N'A   B' NormalSpaces) NormalSpaces
WHERE NoSpaces.NoSpaces = NormalSpaces.NormalSpaces

-- Do equal, which is unexpected
SELECT *
  FROM (SELECT N'AB' NoSpaces) NoSpaces,
       (SELECT N'A' + NCHAR(8239) + NCHAR(8239) + NCHAR(8239) + N'B' NNBSpaces) NNBSpaces
WHERE NoSpaces.NoSpaces = NNBSpaces.NNBSpaces   

其他一些字符串函数会忽略 NNBSP,例如 LIKE 和 CHARINDEX。 LIKE与equals结果相同,CHARINDEX返回0,表示没有找到该字符。

但是,LEN 和 SUBSTRING 等其他函数确实承认它们的存在。

在研究上述每个函数时,我发现当前排序规则可以成为字符串比较的一个因素。我当前的排序规则是 SQL_Latin1_General_CP1_CI_AS,但是我已经尝试了所有的“SQL_Latin1_General”排序规则,所有这些排序规则都具有相同的结果。

谁能提供任何关于为什么会发生这种情况的见解?

【问题讨论】:

    标签: sql-server string-comparison unicode-string


    【解决方案1】:

    这是因为美国英语的默认 SQL Server 排序规则 SQL_Latin1_General_CP1_CI_AS 无法正确处理 NNBSP Unicode 字符比较。

    从 SQL Server 2008 及更高版本开始,有更新的“Latin1”排序规则可用,其名称中包含“_100”。使用这些较新的排序规则中的任何一个,我观察到的问题都不存在。

    根据MSDN(我通过this answer 找到),这些较新的排序规则具有许多更新和更正的功能。仅根据其描述,我认为纠正该问题的更改是:

    权重已添加到以前未加权的字符中,这些字符本来可以进行同等比较。

    如果有人有任何其他见解,我很想听听。

    【讨论】:

      猜你喜欢
      • 2010-10-10
      • 2014-01-26
      • 2012-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多