Sql server 缩小无中断空间比较在SQL Server中失败

Sql server 缩小无中断空间比较在SQL Server中失败,sql-server,string-comparison,unicode-string,Sql Server,String Comparison,Unicode String,至少在SQL Server 2012和2016中,在相等性比较中忽略了窄无中断字符NNBSP、Unicode 8239。例如,以下面两个查询为例,它们比较字符串“AB”和“AB”。第一个字符有普通的ASCII字符32个空格;第二个使用NNBSP -- Do not equal, as expected SELECT * FROM (SELECT N'AB' NoSpaces) NoSpaces, (SELECT N'A B' NormalSpaces) NormalSpac

至少在SQL Server 2012和2016中,在相等性比较中忽略了窄无中断字符NNBSP、Unicode 8239。例如,以下面两个查询为例,它们比较字符串“AB”和“AB”。第一个字符有普通的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拉丁1\u General\u CP1\u CI\u AS,但是我尝试了所有SQL拉丁1\u General排序规则,所有这些都有相同的结果


有人能解释为什么会发生这种情况吗?

之所以会发生这种情况,是因为美式英语的默认SQL Server排序规则SQL\u Latin1\u General\u CP1\u CI\u as无法正确处理NNBSP Unicode字符比较

从SQL Server 2008及更新版本开始,有更新的Latin1排序规则可用,其名称中包括_100。使用这些较新的排序规则,我观察到的问题并不存在

根据我找到的via,这些较新的排序规则具有许多更新和更正的功能。仅根据其描述,我认为纠正该问题的变化是:

加权已添加到以前的非加权字符中,这些字符将进行相等的比较

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