例如,如果我有这些数据:
CREATE TABLE FooBar ( Name varchar(16) )
INSERT FooBar SELECT 'test@test.com'
Run Code Online (Sandbox Code Playgroud)
以下查询不会返回我期望的内容:
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
Run Code Online (Sandbox Code Playgroud)
为什么=(我假设的意思是完全等于)在末尾返回数据时有额外的空间,而a LIKE则没有?
制定标准取决于填充(ANSI标准要求比较中使用的字符串填充,以便在比较之前它们的长度匹配)
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规范的部分.