4

たとえば、このデータがある場合:

CREATE TABLE FooBar ( Name varchar(16) )

INSERT FooBar SELECT 'test@test.com'

次のクエリは、私が期待するものを返しません。

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

なぜ=(私が推測するのは正確に等しいと思いますが)最後に余分なスペースがあるとデータが返されますが、aは返されLIKEませんか?

4

1 に答える 1

5

標準の設定はパディングに依存します(ANSI標準では、比較に使用される文字列に、比較する前に長さが一致するようにパディングが必要です)

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

このルールの唯一の例外は、LIKE述語です。LIKE述語式の右側に末尾にスペースがある値が含まれている場合、SQL Serverは、比較が行われる前に2つの値を同じ長さにパディングしません。LIKE述語の目的は、定義上、単純な文字列等価性テストではなくパターン検索を容易にすることであるため、これは前述のANSISQL-92仕様のセクションに違反しません。

SQLServerが文字列と末尾のスペースを比較する方法も参照してください

于 2012-09-04T19:18:08.863 に答える