在SQL查询中跟踪空白的处理是什么?

时间:2012-09-04 19:15:06

标签: sql-server tsql

例如,如果我有这些数据:

CREATE TABLE FooBar ( Name varchar(16) )

INSERT FooBar SELECT 'test@test.com'

以下查询不会返回我期望的内容:

SELECT * FROM FooBar WHERE Name = 'test@test.com       '  -- Returns the row

SELECT * FROM FooBar WHERE Name LIKE 'test@test.com '  -- Nothing Returned

SELECT * FROM FooBar WHERE Name = ' test@test.com' -- Nothing Returned

为什么=(我假设它意味着完全相等)在末尾返回数据时有额外的空格,而LIKE则没有?

1 个答案:

答案 0 :(得分:5)

选择标准取决于填充(ANSI标准要求比较中使用的字符串填充,以便在比较之前它们的长度匹配)

  

SQL Server遵循ANSI / ISO SQL-92规范(第8.2节,   关于如何将字符串与空格进行比较的一般规则#3)。 ANSI   标准要求填充使用的字符串   比较,以便在比较它们之前它们的长度匹配。该   padding直接影响WHERE和HAVING子句的语义   谓词和其他Transact-SQL字符串比较。例如,   Transact-SQL认为字符串'abc'和'abc'是等价的   对于大多数比较操作。

     

此规则的唯一例外是LIKE谓词。当正确的时候   LIKE谓词表达式的一侧具有带尾随的值   空间,SQL Server不会将这两个值填充到相同的长度   在比较之前。因为喜欢的目的   根据定义,谓词是为了促进模式搜索   比简单的字符串相等测试,这不违反该部分   前面提到的ANSI SQL-92规范。

另见how SQL Server compares strings with trailing spaces