ber*_*d_k 17 sql-server-2008 empty-string
谁能解释为什么
select case when '' = ' ' then 1 else 0 end, LEN(''), LEN(' '), DATALENGTH(''), DATALENGTH(' ');
Run Code Online (Sandbox Code Playgroud)
产量
----------- ----------- ----------- ----------- -----------
1 0 0 0 1
Run Code Online (Sandbox Code Playgroud)
有趣的结果是,在
create table test ( val varchar(10) );
insert into test values( '' );
update test set val = ' ' where val = '';
Run Code Online (Sandbox Code Playgroud)
更新确实会用空白替换空字符串,但 where 子句保持为真,并且重复执行更新语句告诉
(1 row(s) affected)
Run Code Online (Sandbox Code Playgroud)
Ole*_*Dok 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
Run Code Online (Sandbox Code Playgroud)
这里有一些关于尾随空格和LIKE
子句的更多细节。
归档时间: |
|
查看次数: |
6456 次 |
最近记录: |