No SQL Server 2008, por que isso retorna a linha, mesmo quando adiciono um espaço em branco, ou dois, ou mais, ao final da cláusula where? registros zero não deveriam ser encontrados no exemplo a seguir?
WITH SRC AS (SELECT cast('12345' as varchar) DEMO)
SELECT * FROM SRC WHERE DEMO='12345 '
E se alguém precisar consultar para encontrar, '1234 '
mas não'1234'
O que está acontecendo é que o SQL preenche os espaços no final das strings para que tenham o mesmo comprimento. Então, se você tentar fazer algo como:
Na verdade, você receberá 1 de volta, embora não sejam iguais. No entanto, se você fizer algo como:
Ele não retornará nada, pois estaria comparando 'a' com 'a' que não correspondem.
No entanto, isso retornaria 1:
Como está comparando 'a' com 'a'
Se você estiver usando dados Unicode, basta usar
LIKE
. Da documentação :Com dados não Unicode, você ainda pode obter o
LIKE
comportamento Unicode, ao custo de algumas conversões implícitas (observe que oLIKE
padrão na segunda consulta tem um 'N' inicial, denotando uma string Unicode literal):Resultados:
O código com a conversão implícita ainda pode usar um índice, por meio da mágica da geração de busca dinâmica :
Em relação à seguinte parte da pergunta:
Parece que usar um Collation binário (ou seja, um que termina em
_BIN2
) não funciona para isso, mas você também pode compararDATALENGTH
os dois valores:Retorna:
Uma alternativa à resposta de srutzky para a parte "e se" da pergunta:
Apenas certifique-se de que os últimos caracteres do que você está comparando não sejam espaços em branco.
É melhor manter ambas as condições na cláusula WHERE (a comparação direta e a comparação calculada) para preservar o uso do índice.