Encontré un comportamiento interesante en SQL Server (observado en 2005 y 2012) hoy que esperaba que alguien pudiera explicarlo.
Una consulta que realiza una comparación usando =
un campo NVARCHAR ignora el espacio final en la cadena (o recorta automáticamente el valor antes de la comparación) pero la misma consulta que usa el like
operador no ignora el espacio. La clasificación utilizada es Latin1_General_CI_AS en 2012.
Considere este violín de SQL: http://sqlfiddle.com/#!6/72262/4
Tenga en cuenta que el like
operador no devuelve un resultado para la cadena de espacio final, pero el =
operador sí. ¿Por qué es esto?
Puntos de bonificación: no puedo replicar esto en un campo VARCHAR, habría pensado que un espacio se manejaría de la misma manera en ambos tipos de datos, ¿es esto cierto?
MyString+'x' = ltrim(rtrim(MyString))+'x'
como se sugiere en este blogRespuestas:
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:
El operador LIKE no rellena sus operandos. También se comporta de manera diferente para
VARCHAR
y losNVARCHAR
tipos de columna :El comportamiento del operador LIKE para el tipo ASCII es específico de SQL Server; para el tipo Unicode es compatible con ANSI.
fuente
SQL nació en una era en la que la mayoría de los lenguajes de procesamiento de datos usaban longitudes fijas para cada campo / variable. El relleno automático de los campos de texto con espacios adicionales también fue parte de esa imagen. Para alinearse con ese comportamiento, el tipo CHAR SQL original se definió explícitamente para su operador '=' para ignorar los espacios finales. (Si le resulta extraño, muéstreme un caso convincente en el que los espacios finales anexados a un texto tengan un significado comercial real real ).
Los tipos SQL CHAR han evolucionado en todo tipo de direcciones desde entonces, pero no es inconcebible que ciertos tipos de datos más modernos aún hayan heredado algunas características de sus predecesores históricos.
fuente
En la documentación de LIKE (Transact-SQL) , Microsoft escribe (el énfasis es mío):
fuente