sql >> Database teknologi >  >> RDS >> Sqlserver

LEN() vs DATALENGTH() i SQL Server

Når du bruger T-SQL i SQL Server (eller Azure), skal LEN() og DATALENGTH() funktioner vil ofte returnere det samme resultat, men ikke altid. Der er nogle tilfælde, hvor disse funktioner vil returnere helt forskellige resultater for, hvad der ser ud til at være de samme data. Dette skyldes, at der er en vigtig forskel mellem hvordan LEN() og DATALENGTH() funktioner fungerer, som vi vil se her.

Først og fremmest, her er en hurtig definition af hver:

LEN()
Returnerer antallet af tegn i det angivne strengudtryk, undtagen efterfølgende blanktegn.
DATALENGTH()
Returnerer antallet af bytes brugt til at repræsentere ethvert udtryk.

Bemærk "tegn" vs. "bytes". Bemærk også, at "eksklusive efterstillede emner" kun gælder for én.

Her er nogle eksempler for at demonstrere forskellene mellem LEN() og DATALENGTH() .

Tilsluttede emner

En forskel mellem LEN() og DATALENGTH() funktioner er, at LEN() funktion ekskluderer efterfølgende mellemrum (efterliggende mellemrum, tabulatorer osv.), mens DATALENGTH() inkluderer efterstillede emner. Bemærk, vi taler kun om tomme felter, der kommer i slutningen af strengen – ikke i starten eller i midten.

Her er et eksempel uden efterstillede emner:

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

Resultat:

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

Og her er et eksempel med efterstillede emner:

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

Resultat:

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

Indledende mellemrum tælles dog af begge funktioner:

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

Resultat:

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

Bytes vs. tegn

En anden vigtig forskel mellem LEN() og DATALENGTH() er det LEN() funktion returnerer antallet af tegn i en snor. På den anden side DATALENGTH() returnerer antallet af bytes i et udtryk.

Dette er en vigtig skelnen, fordi antallet af bytes i et udtryk ikke nødvendigvis matcher antallet af tegn i strengen. Ved behandling af en unicode-streng, DATALENGTH() returnerer det dobbelte af antallet af tegn. Dette skyldes, at en unicode-streng gemmer 2 bytes pr. tegn.

I ovenstående eksempel så vi, at begge LEN() og DATALENGTH() returnerede det samme resultat for ordet Lit ( 3 ). Men når vi først begynder at forespørge i en database, vil resultatet afhænge af, hvordan dataene opbevares. For eksempel, hvis det er gemt som varchar , vil resultaterne være de samme. Hvis det er gemt som nvarchar den DATALENGTH() funktionen returnerer det dobbelte af antallet af tegn. Og hvis det er gemt som sige, char(25)DATALENGTH() returnerer nøjagtigt 25 tegn.

Eksempler

Lad os køre følgende forespørgsel:

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

Resultaterne af denne forespørgsel vil afhænge af, hvordan dataene er gemt.

nvarchar(255)

Hvis ArtistName kolonne gemmer data som nvarchar(255) :

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

varchar(255)

Hvis vi ændrer den kolonne til varchar(255) , får vi følgende resultat:

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

char(25)

Hvis vi ændrer den kolonne til char(25) , får vi følgende resultat:

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

Så måske er moralen ved alt dette, hvis du oplever at få mærkelige resultater, når du prøver at hente strenglængder osv., så tjek at du bruger den korrekte funktion.


  1. Parametre tabelnavn i .NET/SQL?

  2. Oracle PL/SQL - tips til øjeblikkelig output / konsoludskrivning

  3. PL/pgSQL kontrollerer om der findes en række

  4. Hvordan date_trunc() virker i PostgreSQL