İlk cevabım, OFF olarak ayarlanmış ANSI_PADDING bayrağının davranıştaki farktan dolayı sorumlu olabileceğini ileri sürdü. Ancak, bu yanlış; bu bayrağın depolama üzerinde etkisi vardır, ancak eşitlik karşılaştırması yoktur.
Aradaki fark Microsoft'un SQL standardını uygulamasından kaynaklanıyor . Standart, eşitliği kontrol ederken , eşitlik operatörünün sol ve sağ tarafındaki her iki dizginin de aynı uzunlukta olması için doldurulması gerektiğini belirtir . Bu aşağıdaki sonuçları açıklar:
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 operatörü işlenenlerini doldurmaz. Ayrıca sütun türleri VARCHAR
ve NVARCHAR
sütun türleri için farklı davranır :
-- 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 türü için LIKE işlecinin davranışı SQL Server'a özgüdür; Unicode tipi için ANSI uyumludur.
MyString+'x' = ltrim(rtrim(MyString))+'x'
önerildiği gibi kontrol etmek için bir geçici çözüm buldum