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

LEN() vs DATALENGTH() in SQL Server

Quando si utilizza T-SQL in SQL Server (o Azure) il LEN()DATALENGTH() le funzioni restituiranno spesso lo stesso risultato, ma non sempre. Ci sono alcuni casi in cui queste funzioni restituiranno risultati completamente diversi per quelli che sembrano essere gli stessi dati. Questo perché c'è un'importante differenza tra il modo in cui LEN()DATALENGTH() le funzioni funzionano, come vedremo qui.

Innanzitutto, ecco una rapida definizione di ciascuno:

LEN()
Restituisce il numero di caratteri dell'espressione stringa specificata, esclusi gli spazi finali.
DATALENGTH()
Restituisce il numero di byte utilizzati per rappresentare qualsiasi espressione.

Nota "caratteri" vs "byte". Tieni inoltre presente che "esclusi gli spazi vuoti finali" si applica solo a uno.

Ecco alcuni esempi per dimostrare le differenze tra LEN()DATALENGTH() .

Spazi vuoti finali

Una differenza tra LEN()DATALENGTH() funzioni è che il LEN() funzione esclude spazi finali (spazi finali, tabulazioni, ecc.) mentre DATALENGTH() include spazi vuoti finali. Nota, stiamo parlando solo di spazi vuoti che arrivano alla fine della stringa – non all'inizio o nel mezzo.

Ecco un esempio senza spazi vuoti finali:

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

Risultato:

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

Ed ecco un esempio con spazi vuoti finali:

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

Risultato:

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

Tuttavia, gli spazi iniziali vengono contati da entrambe le funzioni:

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

Risultato:

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

Byte vs caratteri

Un'altra differenza fondamentale tra LEN()DATALENGTH() è che il LEN() la funzione restituisce il numero di caratteri in una stringa. D'altra parte, DATALENGTH() restituisce il numero di byte in un'espressione.

Questa è una distinzione importante perché il numero di byte in un'espressione non corrisponde necessariamente al numero di caratteri nella stringa. Quando si elabora una stringa unicode, DATALENGTH() restituirà il doppio del numero di caratteri. Questo perché una stringa unicode memorizza 2 byte per carattere.

Nell'esempio sopra, abbiamo visto che entrambi LEN()DATALENGTH() ha restituito lo stesso risultato per la parola Lit ( 3 ). Ma, una volta che iniziamo a interrogare un database, il risultato dipenderà da come vengono archiviati i dati. Ad esempio, se è archiviato come varchar , i risultati saranno gli stessi. Se è archiviato come nvarchar il DATALENGTH() funzione restituirà il doppio del numero di caratteri. E se è memorizzato come, ad esempio, char(25)DATALENGTH() restituirà esattamente 25 caratteri.

Esempi

Eseguiamo la seguente query:

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

I risultati di questa query dipenderanno da come vengono archiviati i dati.

nvarchar(255)

Se il ArtistName la colonna memorizza i dati come nvarchar(255) :

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

varchar(255)

Se cambiamo quella colonna in varchar(255) , otteniamo il seguente risultato:

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

carattere(25)

Se cambiamo quella colonna in char(25) , otteniamo il seguente risultato:

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

Quindi forse una morale per tutto questo è, se ti ritrovi a ottenere risultati strani quando provi a recuperare lunghezze di stringhe ecc., controlla di utilizzare la funzione corretta.