空字符串:为什么或何时“”等于“”?


17

谁能解释为什么

select case when '' = ' ' then 1 else 0 end, LEN(''), LEN(' '), DATALENGTH(''), DATALENGTH(' ');

产量

----------- ----------- ----------- ----------- -----------
1           0           0           0           1

有趣的结果是

create table test ( val varchar(10) );
insert into test values( '' );
update test set val = ' ' where val = '';

更新确实将空字符串替换为空白,但是where子句保持为真,并且重复执行update语句告诉

(1 row(s) affected)

Answers:


22

尾随空白说明

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规范的部分。

这是上述所有情况的众所周知的示例:

DECLARE @a VARCHAR(10)
DECLARE @b varchar(10)

SET @a = '1'
SET @b = '1 ' --with trailing blank

SELECT 1
WHERE 
    @a = @b 
AND @a NOT LIKE @b
AND @b LIKE @a

这是有关尾随空格和LIKE子句的更多详细信息。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.