私の最初の答えは、OFFに設定されたANSI_PADDINGフラグが動作の違いのせいかもしれないことを示唆しました。ただし、これは正しくありません。このフラグはストレージにのみ影響しますが、等価比較には影響しません。
この違いは、MicrosoftによるSQL標準の実装に起因しています。標準では、等価性をチェックする場合、等価演算子の左右両方の文字列を同じ長さになるようにパディングする必要があるとされています。これにより、次の結果が説明されます。
insert into test_padding (varchar_clmn, nvarchar_clmn) values ('space ', 'nspace ')
go
-- equality for varchar column
select count(*) from test_padding where varchar_clmn = 'space' -- returns 1
select count(*) from test_padding where varchar_clmn = 'space ' -- returns 1
select count(*) from test_padding where varchar_clmn = 'space ' --returns 1
-- equality for nvarchar column
select count(*) from test_padding where nvarchar_clmn = 'nspace' -- returns 1
select count(*) from test_padding where nvarchar_clmn = 'nspace ' -- returns 1
select count(*) from test_padding where nvarchar_clmn = 'nspace ' --returns 1
LIKE演算子は、オペランドを埋め込みません。列タイプと列タイプに対しても異なる動作をVARCHAR
しNVARCHAR
ます。
-- likeness for varchar column
select count(*) from test_padding where varchar_clmn like 'space' -- returns 1
select count(*) from test_padding where varchar_clmn like 'space ' -- returns 1
select count(*) from test_padding where varchar_clmn like 'space ' -- returns 0
-- likeness for nvarchar column
select count(*) from test_padding where nvarchar_clmn like 'nspace' -- returns 0
select count(*) from test_padding where nvarchar_clmn like 'nspace ' -- returns 1
select count(*) from test_padding where nvarchar_clmn like 'nspace ' -- returns 0
ASCIIタイプのLIKE演算子の動作は、SQL Server固有です。Unicodeタイプの場合、ANSIに準拠しています。
MyString+'x' = ltrim(rtrim(MyString))+'x'
提案として、このブログに