2009-09-04 6 views
3

J'ai une table (t) avec une colonne (c) définie comme varchar 20, contenant les valeurs 'a', 'b' et 'c'SQL - Pourquoi est-paramètre coupé

Si j'exécutez la commande suivante sql, une valeur est renvoyée:

select * from table where c = 'a ' 

Pourquoi?

Je suppose que c'est couler/rogner le paramètre d'une certaine façon, mais pourquoi?

Comment puis-je recherche vraiment 'a '

+1

Quel SGBD utilisez-vous? – jmucchiello

+0

Ceci est SQL Server 2005 – hitch

Répondre

1

Pour le comparer à une colonne varchar, votre chaîne littérale doit aussi être un type varchar. Varchar supprime les espaces blancs supplémentaires. Il varie, d'où VARchar. Le type char ne supprime pas les espaces et ajoutera des espaces supplémentaires à la fin d'un littéral si nécessaire. Vous pouvez vérifier cela (et fixer votre recherche avec la fonction LEN():

declare @a varchar(20) = 'a  ' 
select * from t where c = @a and len(@a) = Len(c) 
+0

J'ai trouvé que l'utilisation de len n'a pas résolu ce problème - si je l'ai fait: déclarer @a varchar (20) définir @a = 'a' sélectionner len (c), len (@a) , * à partir de t où c = @a et len ​​(c) = len (@a) il a retourné une ligne, et les valeurs de len étaient tous les deux 4 Cependant, si j'ai utilisé la longueur d'onde, cela n'a pas réussi. Merci pour le pointeur. – hitch

0

je solution simple:.

declare @a varchar(20) = 'a  ' 
select * from t where c + '$' = @a + '$' 
Questions connexes