例如,如果我有这些数据:
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
则没有?
答案 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规范。