Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

LEN() vs DATALENGTH() dans SQL Server

Lors de l'utilisation de T-SQL dans SQL Server (ou Azure), le LEN() et DATALENGTH() les fonctions renverront souvent le même résultat, mais pas toujours. Dans certains cas, ces fonctions renverront des résultats complètement différents pour ce qui semble être les mêmes données. C'est parce qu'il y a une différence importante entre la façon dont le LEN() et DATALENGTH() les fonctions fonctionnent, comme nous le verrons ici.

Tout d'abord, voici une définition rapide de chacun :

LEN()
Renvoie le nombre de caractères de l'expression de chaîne spécifiée, à l'exclusion des blancs de fin.
DATALENGTH()
Renvoie le nombre d'octets utilisés pour représenter n'importe quelle expression.

Remarque "caractères" vs "octets". Notez également que "exclure les blancs de fin" ne s'applique qu'à un seul.

Voici quelques exemples pour illustrer les différences entre LEN() et DATALENGTH() .

Espaces de fin

Une différence entre le LEN() et DATALENGTH() fonctions est que le LEN() la fonction exclut blancs à la fin (espaces à la fin, tabulations, etc.) tandis que DATALENGTH() comprend blancs à la fin. Remarque, nous ne parlons que des blancs qui viennent à la fin de la chaîne - ni au début ni au milieu.

Voici un exemple sans blancs à la fin :

SELECT 
    LEN('Lit') AS Len,
    DATALENGTH('Lit') AS DataLength;

Résultat :

Len  DataLength
---  ----------
3    3   

Et voici un exemple avec blancs à la fin :

SELECT 
    LEN('Lit ') AS Len,
    DATALENGTH('Lit ') AS DataLength;

Résultat :

Len  DataLength
---  ----------
3    4  

Cependant, les espaces de début sont comptés par les deux fonctions :

SELECT 
    LEN(' Lit') AS Len,
    DATALENGTH(' Lit') AS DataLength;

Résultat :

Len  DataLength
---  ----------
4    4         

Octets vs Caractères

Une autre différence clé entre LEN() et DATALENGTH() est-ce le LEN() la fonction renvoie le nombre de caractères dans une chaîne. D'autre part, DATALENGTH() renvoie le nombre d'octets dans une expression.

Il s'agit d'une distinction importante car le nombre d'octets dans une expression ne correspond pas nécessairement au nombre de caractères dans la chaîne. Lors du traitement d'une chaîne Unicode, DATALENGTH() renverra deux fois le nombre de caractères. En effet, une chaîne Unicode stocke 2 octets par caractère.

Dans l'exemple ci-dessus, nous avons vu que LEN() et DATALENGTH() a renvoyé le même résultat pour le mot Lit ( 3 ). Mais, une fois que nous commençons à interroger une base de données, le résultat dépendra de la façon dont les données sont stockées. Par exemple, s'il est stocké en tant que varchar , les résultats seront les mêmes. S'il est stocké en tant que nvarchar le DATALENGTH() La fonction renverra le double du nombre de caractères. Et s'il est stocké comme, par exemple, char(25)DATALENGTH() renverra exactement 25 caractères.

Exemples

Exécutons la requête suivante :

SELECT 
    ArtistName, 
    LEN(ArtistName) AS Len,
    DATALENGTH(ArtistName) AS DataLength
FROM Artists 
WHERE ArtistName = 'Lit';

Les résultats de cette requête dépendront de la manière dont les données sont stockées.

nvarchar(255)

Si le ArtistName la colonne stocke les données en tant que nvarchar(255) :

ArtistName  Len  DataLength
----------  ---  ----------
Lit         3    6         

varchar(255)

Si nous remplaçons cette colonne par varchar(255) , nous obtenons le résultat suivant :

ArtistName  Len  DataLength
----------  ---  ----------
Lit         3    3         

car(25)

Si nous remplaçons cette colonne par char(25) , nous obtenons le résultat suivant :

ArtistName                 Len  DataLength
-------------------------  ---  ----------
Lit                        3    25        

Alors peut-être une morale à tout cela est, si vous obtenez des résultats étranges lorsque vous essayez de récupérer des longueurs de chaîne, etc., vérifiez que vous utilisez la bonne fonction.