Me deparei com um comportamento interessante no SQL Server (observado em 2005 e 2012) hoje que esperava que alguém pudesse explicar.
Uma consulta fazendo uma comparação usando =
um campo NVARCHAR ignorou o espaço à direita na string (ou cortou automaticamente o valor antes da comparação), mas a mesma consulta usando o like
operador não ignorou o espaço. O agrupamento usado é Latin1_General_CI_AS em 2012.
Considere este SQL Fiddle: http://sqlfiddle.com/#!6/72262/4
Observe que o like
operador não retorna um resultado para a string de espaço à direita, mas o =
operador retorna. Por que é isso?
Pontos de bônus: não consigo replicar isso em um campo VARCHAR, pensei que um espaço seria tratado da mesma forma em ambos os tipos de dados - isso é verdade?
Minha resposta inicial sugeriu que o sinalizador ANSI_PADDING definido como OFF pode ser o culpado pela diferença de comportamento. No entanto, isso é incorreto; este sinalizador tem efeito apenas no armazenamento, mas não na comparação de igualdade.
A diferença decorre da implementação do padrão SQL pela Microsoft . O padrão afirma que, ao verificar a igualdade, as strings à esquerda e à direita do operador de igualdade devem ser preenchidas para ter o mesmo comprimento . Isso explica os seguintes resultados:
O operador LIKE não preenche seus operandos. Ele também se comporta de maneira diferente para
VARCHAR
eNVARCHAR
tipos de coluna :O comportamento do operador LIKE para o tipo ASCII é específico do SQL Server; para o tipo Unicode, é compatível com ANSI.
O SQL nasceu em uma época em que a maioria das linguagens de processamento de dados usava comprimentos fixos para cada campo/variável. O preenchimento automático de campos de texto com espaços extras também fazia parte dessa imagem. Para alinhar com esse comportamento, o tipo SQL CHAR original foi definido explicitamente para que seu operador '=' ignore os espaços à direita. (Se você achar isso estranho, mostre-me um caso convincente em que os espaços à direita anexados a um texto tenham um significado comercial real real .)
Os tipos SQL CHAR evoluíram em todas as direções desde então, mas não é inconcebível que certos tipos de dados mais modernos ainda tenham herdado algumas características de seus predecessores históricos.
Na documentação para LIKE (Transact-SQL) , a Microsoft escreve (ênfase minha):