Quando si utilizza T-SQL in SQL Server (o Azure) il LEN()
e 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()
e 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()
e DATALENGTH()
.
Spazi vuoti finali
Una differenza tra LEN()
e 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()
e 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()
e 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.