Comportamento de Varchar com espaços no final


14

Quando eu uso um Varchar com espaços, ele ignora os espaços no final.

ex:

declare @X varchar(50)

Este...

set  @X= 'John'

...é o mesmo que...

set @X= 'John           '

Considera que estes são iguais. Como posso fazer com que o sistema os reconheça como diferentes?

Respostas:


23

Tudo está de acordo com o padrão ANSI:

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 seqüências de caracteres '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 as 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 .

MAS, se você quiser diferenciá-los - você pode optar por usar a DATALENGTHfunção em vez de LEN, porque

SELECT 1 WHERE LEN('John ') = LEN('John')

vai te colocar 1 em vez de

SELECT 1 WHERE DATALENGTH('John ') = DATALENGTH('John')

A solução é

  • usar a função DATALENGTH para diferir entre cadeias
  • para converter a string no tipo NVARCHAR - pode ser melhor declarar esse tipo como parâmetro de SP

Pós espetacular, finalmente encontrei algumas boas informações
Gaspa79

-2

Você pode simplesmente adicionar um espaço em branco à sua condição.

set @X= 'John           \n'

Espaços à direita em funções de seqüência de caracteres


5
\nnão tem significado no SQL Server. Não é interpretado como uma nova linha. Esta não é uma resposta para a pergunta de qualquer maneira.
Martin Smith

@MartinSmith, mas está escrito no MSDN "Se você precisar ter espaços à direita em sua string, considere anexar um caractere de espaço em branco no final, para que o SQL Server não apare a string".
Yiping
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.