Comportement de Varchar avec des espaces à la fin

14

Lorsque j'utilise un Varchar avec des espaces, il ignore les espaces à la fin.

ex:

declare @X varchar(50)

Cette...

set  @X= 'John'

...est le même que...

set @X= 'John           '

Il les considère comme égaux. Comment puis-je faire en sorte que le système les reconnaisse comme différents?

AMH
la source

Réponses:

23

Tout est conforme à la norme ANSI:

Explication des blancs de fin :

SQL Server suit la spécification ANSI / ISO SQL-92 (Section 8.2,, Règles générales # 3) sur la façon de comparer les chaînes avec des espaces. La norme ANSI requiert un remplissage pour les chaînes de caractères utilisées dans les comparaisons afin que leurs longueurs correspondent avant de les comparer. Le remplissage affecte directement la sémantique des prédicats de clause WHERE et HAVING et d'autres comparaisons de chaînes Transact-SQL. Par exemple, Transact-SQL considère que les chaînes «abc» et «abc» sont équivalentes pour la plupart des opérations de comparaison.

La seule exception à cette règle est le prédicat LIKE. Lorsque le côté droit d'une expression de prédicat LIKE comporte une valeur avec un espace de fin, SQL Server ne remplit pas les deux valeurs à la même longueur avant la comparaison. Étant donné que le but du prédicat LIKE, par définition, est de faciliter les recherches de modèles plutôt que les simples tests d'égalité de chaîne, cela ne viole pas la section de la spécification ANSI SQL-92 mentionnée précédemment.

Voici un exemple bien connu de tous les cas mentionnés ci-dessus:

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

Voici quelques détails supplémentaires sur les espaces de fin et la LIKEclause .

MAIS si vous voulez les différencier - vous pouvez décider d'utiliser la DATALENGTHfonction au lieu de LEN, car

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

vous mettra 1 au lieu de

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

La solution est

  • utiliser la fonction DATALENGTH pour différer entre les chaînes
  • pour convertir la chaîne en type NVARCHAR - mieux vaut déclarer ce type en paramètre de SP
Oleg Dok
la source
Post spectaculaire, enfin trouvé de bonnes infos
Gaspa79
-2

Vous pouvez simplement ajouter un espace blanc à votre condition.

set @X= 'John           \n'

Espaces de fin dans les fonctions de chaîne

Yiping
la source
5
\nn'a aucune signification dans SQL Server. Il n'est pas interprété comme une nouvelle ligne. Ce n'est pas une réponse à la question posée de toute façon.
Martin Smith
@MartinSmith mais il est écrit dans MSDN "Si vous devez avoir des espaces de fin dans votre chaîne, vous devez envisager d'ajouter un caractère d'espace blanc à la fin, afin que SQL Server ne coupe pas la chaîne."
Yiping