Strings vazias: por que ou quando é '' igual a ''?

17

Quem pode explicar o porquê

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

rendimentos

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

A conseqüência engraçada disso é que, em

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

a atualização substituirá a cadeia vazia por um espaço em branco, mas a cláusula where continua verdadeira e as execuções repetidas da instrução update informam

(1 row(s) affected)
bernd_k
fonte

Respostas:

22

Espaços em branco à direita explicados :

O SQL Server segue a especificação ANSI / ISO SQL-92 (Seção 8.2, Regras gerais nº 3) sobre como comparar seqüências de caracteres com espaços. O padrão ANSI requer preenchimento para as seqüências de caracteres usadas nas comparações para que seus comprimentos correspondam antes de compará-las. O preenchimento afeta diretamente a semântica dos predicados das cláusulas WHERE e HAVING e outras comparações de cadeias Transact-SQL. Por exemplo, o Transact-SQL considera as sequências 'abc' e 'abc' como equivalentes para a maioria das operações de comparação.

A única exceção a esta regra é o predicado LIKE. Quando o lado direito de uma expressão de predicado LIKE apresenta um valor com um espaço à direita, o SQL Server não preenche os dois valores no mesmo comprimento antes que a comparação ocorra. Como o objetivo do predicado LIKE, por definição, é facilitar pesquisas de padrões em vez de simples testes de igualdade de cadeias, isso não viola a seção da especificação ANSI SQL-92 mencionada anteriormente.

Aqui está um exemplo bem conhecido de todos os casos mencionados acima:

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

Aqui estão mais alguns detalhes sobre espaços em branco à direita e a LIKEcláusula .

Oleg Dok
fonte