Мой первоначальный ответ предполагал, что флаг ANSI_PADDING, установленный в OFF, может быть виноват в разнице в поведении. Однако это неверно; этот флаг влияет только на хранилище, но не на сравнение равенства.
Разница заключается в реализации 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
Поведение оператора LIKE для типа ASCII зависит от SQL Server; для типа Unicode это ANSI-совместимый.
MyString+'x' = ltrim(rtrim(MyString))+'x'
как предложено в этом блоге