Моя початкова відповідь підказує, що прапор 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'
як пропонується в цьому блозі