Comportamiento de Varchar con espacios al final


14

Cuando uso un Varchar con espacios, ignora los espacios al final.

ex:

declare @X varchar(50)

Esta...

set  @X= 'John'

...es lo mismo que...

set @X= 'John           '

Considera que estos son iguales. ¿Cómo puedo hacer que el sistema los reconozca como diferentes?

Respuestas:


23

Todo está de acuerdo con el estándar ANSI:

Los espacios en blanco finales explican :

SQL Server sigue la especificación ANSI / ISO SQL-92 (Sección 8.2, Reglas generales # 3) sobre cómo comparar cadenas con espacios. El estándar ANSI requiere un relleno para las cadenas de caracteres utilizadas en las comparaciones para que sus longitudes coincidan antes de compararlas. El relleno afecta directamente la semántica de los predicados de la cláusula WHERE y HAVING y otras comparaciones de cadenas Transact-SQL. Por ejemplo, Transact-SQL considera que las cadenas 'abc' y 'abc' son equivalentes para la mayoría de las operaciones de comparación.

La única excepción a esta regla es el predicado LIKE. Cuando el lado derecho de una expresión de predicado LIKE presenta un valor con un espacio final, SQL Server no rellena los dos valores a la misma longitud antes de que ocurra la comparación. Debido a que el propósito del predicado LIKE, por definición, es facilitar búsquedas de patrones en lugar de simples pruebas de igualdad de cadenas, esto no viola la sección de la especificación ANSI SQL-92 mencionada anteriormente.

Aquí hay un ejemplo bien conocido de todos los casos mencionados anteriormente:

DECLARE @a VARCHAR(10)
DECLARE @b varchar(10)

SET @a = '1'
SET @b = '1 ' --with trailing blank

SELECT 1
WHERE 
    @a = @b 
AND @a NOT LIKE @b
AND @b LIKE @a

Aquí hay más detalles sobre los espacios en blanco finales y la LIKEcláusula .

PERO si desea diferenciarlos, puede decidir usar la DATALENGTHfunción en lugar de LEN, porque

SELECT 1 WHERE LEN('John ') = LEN('John')

te pondrá 1 en lugar de

SELECT 1 WHERE DATALENGTH('John ') = DATALENGTH('John')

La solución es

  • usar la función DATALENGTH para diferir entre cadenas
  • para convertir la cadena en el tipo NVARCHAR: puede ser mejor declarar este tipo al parámetro de SP


-2

Simplemente puede agregar un espacio en blanco a su condición.

set @X= 'John           \n'

Espacios finales en funciones de cadena


55
\nno tiene importancia en SQL Server. No se interpreta como una nueva línea. Esta no es una respuesta a la pregunta formulada de todos modos.
Martin Smith

@MartinSmith pero está escrito en MSDN "Si tiene que tener espacios finales en su cadena, debería considerar agregar un carácter de espacio en blanco al final, para que SQL Server no recorte la cadena".
Yiping
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.