När du använder T-SQL i SQL Server (eller Azure) används LEN()
och DATALENGTH()
funktioner kommer ofta att returnera samma resultat, men inte alltid. Det finns vissa fall där dessa funktioner kommer att returnera helt olika resultat för vad som verkar vara samma data. Detta beror på att det finns en viktig skillnad mellan hur LEN()
och DATALENGTH()
funktioner fungerar, som vi kommer att se här.
Först och främst, här är en snabb definition av var och en:
LEN()
- Returnerar antalet tecken i det angivna stränguttrycket, exklusive efterföljande blanksteg.
DATALENGTH()
- Returnerar antalet byte som används för att representera ett uttryck.
Notera "tecken" kontra "byte". Observera också att "exklusive efterföljande ämnen" endast gäller för en.
Här är några exempel för att visa skillnaderna mellan LEN()
och DATALENGTH()
.
Avslutande ämnen
En skillnad mellan LEN()
och DATALENGTH()
funktioner är att LEN()
funktion utesluter efterföljande blanksteg (efterföljande mellanslag, tabbar, etc) medan DATALENGTH()
inkluderar släpande ämnen. Observera att vi bara pratar om blanks som kommer i slutet av strängen – inte i början eller i mitten.
Här är ett exempel utan efterföljande ämnen:
SELECT LEN('Lit') AS Len, DATALENGTH('Lit') AS DataLength;
Resultat:
Len DataLength --- ---------- 3 3
Och här är ett exempel med efterföljande ämnen:
SELECT LEN('Lit ') AS Len, DATALENGTH('Lit ') AS DataLength;
Resultat:
Len DataLength --- ---------- 3 4
Inledande blanksteg räknas dock av båda funktionerna:
SELECT LEN(' Lit') AS Len, DATALENGTH(' Lit') AS DataLength;
Resultat:
Len DataLength --- ---------- 4 4
Byte kontra tecken
En annan viktig skillnad mellan LEN()
och DATALENGTH()
är det LEN()
funktion returnerar antalet tecken i ett snöre. Å andra sidan, DATALENGTH()
returnerar antalet byte i ett uttryck.
Detta är en viktig skillnad eftersom antalet byte i ett uttryck inte nödvändigtvis matchar antalet tecken i strängen. Vid bearbetning av en unicode-sträng, DATALENGTH()
returnerar dubbelt så många tecken. Detta beror på att en unicode-sträng lagrar 2 byte per tecken.
I exemplet ovan såg vi att båda LEN()
och DATALENGTH()
returnerade samma resultat för ordet Lit
(
3
). Men när vi väl börjar fråga efter en databas kommer resultatet att bero på hur data lagras. Till exempel, om den lagras som varchar , blir resultatet detsamma. Om den är lagrad som nvarchar den DATALENGTH()
funktionen returnerar dubbelt så många tecken. Och om det är lagrat som säg, char(25) , DATALENGTH()
returnerar exakt 25 tecken.
Exempel
Låt oss köra följande fråga:
SELECT ArtistName, LEN(ArtistName) AS Len, DATALENGTH(ArtistName) AS DataLength FROM Artists WHERE ArtistName = 'Lit';
Resultaten av denna fråga beror på hur data lagras.
nvarchar(255)
Om ArtistName
kolumnen lagrar data som nvarchar(255) :
ArtistName Len DataLength ---------- --- ---------- Lit 3 6
varchar(255)
Om vi ändrar den kolumnen till varchar(255) , får vi följande resultat:
ArtistName Len DataLength ---------- --- ---------- Lit 3 3
char(25)
Om vi ändrar den kolumnen till char(25) , får vi följande resultat:
ArtistName Len DataLength ------------------------- --- ---------- Lit 3 25
Så kanske en moral för allt detta är att om du får konstiga resultat när du försöker hämta stränglängder etc, kontrollera att du använder rätt funktion.