在SQL Server 2008中,我有一个称为Zone列的表ZoneReference varchar(50) not null作为主键。
Zone
ZoneReference varchar(50) not null
如果我运行以下查询:
select '"' + ZoneReference + '"' as QuotedZoneReference from Zone where ZoneReference = 'WF11XU'
我得到以下结果:
"WF11XU "
注意尾随空格。
这怎么可能?如果在该行上确实存在尾随空格,那么我期望返回 零 结果,因此我假设SQL Server Management Studio奇怪地显示了其他内容。
在C#代码中,调用zoneReference.Trim()将其删除,表明它是某种空白字符。
zoneReference.Trim()
有人可以帮忙吗?
这是预期的结果:在SQL Server中,=操作员在进行比较时会忽略尾随空格。
=
SQL Server遵循有关如何将字符串与空格进行比较的ANSI / ISO SQL-92规范(第8.2节,通用规则#3)。ANSI标准要求对比较中使用的字符串进行填充,以便它们的长度在比较之前匹配。填充直接影响WHERE和HAVING子句谓词的语义以及其他Transact- SQL字符串比较。例如,Transact-SQL认为字符串“ abc”和“ abc”在大多数比较操作中是等效的。 该规则的唯一例外是LIKE谓词。当LIKE谓词表达式的右侧具有带尾随空格的值时,在进行比较之前,SQL Server不会将两个值填充为相同的长度。因为按照定义,LIKE谓词的目的是为了促进模式搜索,而不是简单的字符串相等性测试,所以这不违反前面提到的ANSI SQL-92规范的部分。
SQL Server遵循有关如何将字符串与空格进行比较的ANSI / ISO SQL-92规范(第8.2节,通用规则#3)。ANSI标准要求对比较中使用的字符串进行填充,以便它们的长度在比较之前匹配。填充直接影响WHERE和HAVING子句谓词的语义以及其他Transact- SQL字符串比较。例如,Transact-SQL认为字符串“ abc”和“ abc”在大多数比较操作中是等效的。
该规则的唯一例外是LIKE谓词。当LIKE谓词表达式的右侧具有带尾随空格的值时,在进行比较之前,SQL Server不会将两个值填充为相同的长度。因为按照定义,LIKE谓词的目的是为了促进模式搜索,而不是简单的字符串相等性测试,所以这不违反前面提到的ANSI SQL-92规范的部分。
资源