sql >> Databasteknik >  >> RDS >> Sqlserver

LEN() vs DATALENGTH() i SQL Server

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.


  1. Strängsammansättning i MySQL

  2. Kan inte hitta microsoft.sqlserver.batchparser.dll

  3. Hur kan jag beskriva en tabell i Oracle utan att använda kommandot DESCRIBE?

  4. GROUP BY för att kombinera/konkatera en kolumn