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.