Question

Récemment, je fait face à un problème lors de l'utilisation len() dans une requête pour trouver la longueur d'une requête, len() ne comptait pas les espaces de fin de la valeur. Mais datalength() est compte les espaces de fin aussi.

Est-ce que cela signifie que si je fais une opération qui traite de la longueur réelle de la valeur alors je dois utiliser dalalength() sur len().

ex: Si je besoin de la valeur d'une valeur particulière à être est de 10 longueur de caractères. à savoir si la valeur est de 3 longueur de caractères que j'ai à ajouter 7 places à elle.

Était-ce utile?

La solution

Oui, c'est exactement ce que vous devez faire. Si vous voulez simplement obtenir le nombre de caractères à l'exclusion des blancs que vous utilisez la fonction LEN(), alors que dans tous les autres cas DATALENGTH().

Même la documentation LEN() a une information pour obtenir le nombre d'octets pour représenter l'extension que vous devez utiliser DATALENGTH()

Voici les liens vers MSDN docs:

LEN ()

DATALENGTH ()

Autres conseils

Faites attention. DATALENGTH renvoie le nombre d'octets utilisés, et non le nombre de caractères.

len compte le nombre de caractères utilisés non le stockage nécessaire, ce sera encore plus évidente lorsque vous utilisez nvarchar au lieu de varchar

len ne compte pas les espaces de fin soit

jetez un oeil à ce

declare @v nchar(5)
select @v ='ABC  '


select len(@v),datalength(@v)

et la sortie pour len est 3 alors que la sortie pour datalength = 10

Il suffit d'utiliser Remplacer ():

SELECT LEN(REPLACE(N'4 Trailing Spaces:    ', ' ', '_'))

Cela remplacera les espaces de fin avec un caractère LEN () sera effectivement compter.
Le problème avec DataLength () est que vous devez garder une trace de wether votre chaîne est Unicode (nChar, nVarChar) ou ASCII (Char, VarChar) pour savoir si vous devez également diviser le datalength d'une chaîne Unicode par 2.

J'étais sur le point d'utiliser le Len (Remplacer ( 'bla bla', » », '_') suggestion quand il m'a frappé, il peut être plus efficace d'utiliser. affichage juste au cas où quelqu'un trébuche sur ce fil comme je l'ai fait.

len ( 'bla bla' + '') - 1

Malheureusement, il n'y a pas de solution parfaite que je suis au courant.

L'une des solutions proposées, LEN(string + '.')-1 renvoie des résultats erronés (-1) si la chaîne est Unicode de taille 4000 ou non Unicode et de taille 8000. En effet, la concaténation est ignorée. Vous pouvez surmonter cela si vous voulez, en jetant la chaîne à une chaîne de taille MAX: LEN(CAST(string as nvarchar(max)) + '.')-1, mais est-il la peine

Comme mentionné par d'autres, DATALENGTH(string) renvoie le nombre d'octets utilisés pour le stockage. Pour les chaînes Unicode, il peut ne pas être suffisant pour diviser le résultat par 2: caractères Unicode de substitution peut prendre plus de 16 bits.

Dans l'ensemble, être conscient des limites de chaque approche et choisissez ce que vous croyez vous causer moins de problèmes.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top