空の文字列: ''または ''が ''と等しいか?


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句はtrueのままであり、更新ステートメントの繰り返し実行は次のように伝えます。

(1 row(s) affected)

回答:


22

末尾の空白の説明

SQL Serverは、文字列をスペースと比較する方法について、ANSI / ISO SQL-92仕様(セクション8.2、一般規則#3)に従います。ANSI標準では、比較に使用する文字列のパディングが必要であるため、比較する前に文字列の長さが一致します。パディングは、WHERE句とHAVING句の述語、およびその他のTransact-SQL文字列比較のセマンティクスに直接影響します。たとえば、Transact-SQLは、文字列 'abc'および 'abc'をほとんどの比較操作で同等と見なします。

この規則の唯一の例外は、LIKE述語です。LIKE述語式の右側に末尾スペースのある値が含まれている場合、SQL Serverは比較が行われる前に2つの値を同じ長さにパディングしません。定義により、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句の詳細を次に示します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.