为什么相等运算符和类似运算符之间的相等比较存在差异?

时间:2010-10-26 12:16:17

标签: sql-server tsql

SELECT au_lname, au_fname  
FROM authors
WHERE au_lname = 'Green '
au_lname                                 au_fname
---------------------------------------- --------------------
Green                                    Marjorie
SELECT au_lname, au_fname
FROM authors
WHERE au_lname LIKE 'Green '
au_lname                                 au_fname
---------------------------------------- --------------------

有人可以解释一下,为什么第二个查询没有返回预期的行?

3 个答案:

答案 0 :(得分:4)

这显然是标准的一个怪癖。也可能是明确的:

  

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

     

此规则的唯一例外是LIKE谓词。当右侧   一个LIKE谓词表达式以a为特色   带有尾随空格的值,SQL   服务器不会将这两个值填充到   比较前的长度相同   发生。因为的目的   根据定义,LIKE谓词是   促进模式搜索   比简单的字符串相等测试,   这不违反   ANSI SQL-92规范   前面提到的。

请参阅hereherehere

奇怪 - 考虑到“平等”和“喜欢”这两个词,我原本以为后者会更自由。

答案 1 :(得分:1)

你的char(8)文字'Green'值会自动转换为与au_lname列相同的数据类型,这很可能是varchar(),因此在转换中会删除尾随空格。这可能是优化器正在尝试使数据类型相同,因此可以使用索引。

SELECT au_lname, au_fname  
FROM authors
WHERE au_lname = 'Green ' --auto conversion to varchar() is 'Green'

使用LIKE,CHAR(8)'Green'值没有自动转换,因此找不到匹配项。最有可能的是,这样做了,因此保留了模式匹配功能。如果您要搜索与LIKE 'xyz% '

完全不同的LIKE 'xyz%'
SELECT au_lname, au_fname
FROM authors
WHERE au_lname LIKE 'Green ' --no conversion, remains CHAR(8) 'Green '

答案 2 :(得分:0)

这取决于存储的填充。

LIKE 'Green%'= 'Green'都会找到“绿色”,而LIKE 'Green '则找不到“绿色”但LIKE 'Green%'会找到“绿色”。 '%Green%'会找到'绿色','先生Green','Green','Green','Green Ghost'和'Greentree'

注意:大多数sql实际上都匹配案例 - 以及:'GreeN','green''GREEN'全部匹配='Green'。