Mi respuesta inicial sugirió que el indicador ANSI_PADDING establecido en OFF puede ser el culpable de la diferencia de comportamiento. Sin embargo, esto es incorrecto; Este indicador solo tiene un efecto en el almacenamiento, pero no en la comparación de igualdad.
La diferencia proviene de la implementación de Microsoft del estándar SQL . El estándar establece que cuando se verifica la igualdad, ambas cadenas izquierda y derecha del operador de igualdad deben ser rellenadas para tener la misma longitud . Esto explica los siguientes resultados:
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
El operador LIKE no rellena sus operandos. También se comporta de manera diferente para VARCHAR
y los NVARCHAR
tipos de columna :
-- 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
El comportamiento del operador LIKE para el tipo ASCII es específico de SQL Server; para el tipo Unicode es compatible con ANSI.
MyString+'x' = ltrim(rtrim(MyString))+'x'
como se sugiere en este blog