【发布时间】: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