sql >> Database >  >> RDS >> Sqlserver

LEN() versus DATALENGTH() in SQL Server

Bij gebruik van T-SQL in SQL Server (of Azure) de LEN() en DATALENGTH() functies zullen vaak hetzelfde resultaat opleveren, maar niet altijd. Er zijn enkele gevallen waarin deze functies totaal verschillende resultaten opleveren voor wat lijkt op dezelfde gegevens. Dit komt omdat er een belangrijk verschil is tussen hoe de LEN() en DATALENGTH() functies werken, zoals we hier zullen zien.

Eerst volgt hier een korte definitie van elk:

LEN()
Retourneert het aantal tekens van de opgegeven tekenreeksuitdrukking, met uitzondering van spaties aan het einde.
DATALENGTH()
Retourneert het aantal bytes dat wordt gebruikt om een ​​uitdrukking weer te geven.

Let op "tekens" versus "bytes". Houd er ook rekening mee dat "exclusief volgspaties" slechts op één van toepassing is.

Hier zijn enkele voorbeelden om de verschillen te demonstreren tussen LEN() en DATALENGTH() .

Blanco's achterop

Een verschil tussen de LEN() en DATALENGTH() functies is dat de LEN() functie exclusief achterliggende spaties (achterliggende spaties, tabbladen, enz.) terwijl DATALENGTH() omvat slepende blanco's. Let op, we hebben het alleen over spaties die aan het einde komen van de snaar – niet aan het begin of in het midden.

Hier is een voorbeeld zonder volgspaties:

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

Resultaat:

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

En hier is een voorbeeld met volgspaties:

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

Resultaat:

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

Voorloopspaties worden echter door beide functies geteld:

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

Resultaat:

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

Bytes versus tekens

Nog een belangrijk verschil tussen LEN() en DATALENGTH() is dat de LEN() functie retourneert het aantal tekens in een touwtje. Aan de andere kant, DATALENGTH() geeft het aantal bytes terug in een uitdrukking.

Dit is een belangrijk onderscheid omdat het aantal bytes in een uitdrukking niet noodzakelijk overeenkomt met het aantal tekens in de tekenreeks. Bij het verwerken van een unicode-tekenreeks, DATALENGTH() geeft het dubbele aantal tekens terug. Dit komt omdat een unicode-reeks 2 bytes per teken opslaat.

In het bovenstaande voorbeeld zagen we dat beide LEN() en DATALENGTH() gaf hetzelfde resultaat voor het woord Lit ( 3 ). Maar zodra we beginnen met het doorzoeken van een database, hangt het resultaat af van hoe de gegevens zijn opgeslagen. Als het bijvoorbeeld is opgeslagen als varchar , zullen de resultaten hetzelfde zijn. Als het is opgeslagen als nvarchar de DATALENGTH() functie retourneert tweemaal het aantal tekens. En als het is opgeslagen als zeg, char(25)DATALENGTH() geeft exact 25 tekens terug.

Voorbeelden

Laten we de volgende query uitvoeren:

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

De resultaten van deze zoekopdracht zijn afhankelijk van hoe de gegevens zijn opgeslagen.

nvarchar(255)

Als de ArtistName kolom slaat gegevens op als nvarchar(255) :

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

varchar(255)

Als we die kolom wijzigen in varchar(255) , krijgen we het volgende resultaat:

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

char(25)

Als we die kolom wijzigen in char(25) , krijgen we het volgende resultaat:

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

Dus misschien een moraal van dit alles, als je merkt dat je rare resultaten krijgt bij het ophalen van stringlengtes, enz., controleer dan of je de juiste functie gebruikt.


  1. Gefaseerde APPL_TOP in Oracle Applications R12

  2. Python REST API's met Flask, Connexion en SQLAlchemy - Deel 2

  3. WHERE-component kan beter worden uitgevoerd voor IN en JOIN of erna

  4. Uitzondering door gebruiker definiëren definiëren met PRAGMA EXCEPTION_INIT