Encontrei um comportamento interessante no SQL Server (observado em 2005 e 2012) hoje que esperava que alguém pudesse explicar.
Uma consulta que faz uma comparação usando =
em um campo NVARCHAR ignorou o espaço à direita na sequência (ou aparou 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 sequência de espaço à direita, mas o =
operador retorna . Por que é isso?
Pontos de bônus: não consigo replicar isso em um campo VARCHAR, eu pensaria que um espaço seria tratado da mesma maneira nos dois tipos de dados - isso é verdade?
MyString+'x' = ltrim(rtrim(MyString))+'x'
conforme sugerido neste blogRespostas:
Minha resposta inicial sugeriu que o sinalizador ANSI_PADDING definido como OFF pode ser o culpado pela diferença de comportamento. No entanto, isso está incorreto; esse sinalizador afeta apenas o armazenamento, mas não a 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 duas strings esquerda e direita do operador de igualdade precisam 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 os tipos
VARCHAR
eNVARCHAR
colunas :O comportamento do operador LIKE para o tipo ASCII é específico do SQL Server; para o tipo Unicode, é compatível com ANSI.
fonte
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 explicitamente definido para o operador '=' ignorar os espaços finais. (Se você acha isso estranho, mostre-me um caso convincente em que os espaços à direita anexados a um texto tenham um significado real nos negócios .)
Os tipos SQL CHAR evoluíram em todos os tipos de 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.
fonte
Na documentação de LIKE (Transact-SQL) , a Microsoft escreve (ênfase minha):
fonte