Cadenas vacías: ¿por qué o cuándo es "igual a"?

17

¿Quién puede explicar por qué?

select case when '' = ' ' then 1 else 0 end, LEN(''), LEN(' '), DATALENGTH(''), DATALENGTH(' ');

rendimientos

----------- ----------- ----------- ----------- -----------
1           0           0           0           1

La graciosa consecuencia de esto es que en

create table test ( val varchar(10) );
insert into test values( '' );
update test set val = ' ' where val = '';

la actualización reemplazará la cadena vacía por un espacio en blanco, pero la cláusula where sigue siendo verdadera y las ejecuciones repetidas de la declaración de actualización indican

(1 row(s) affected)
bernd_k
fuente

Respuestas:

22

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 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 la búsqueda 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 .

Oleg Dok
fuente