Při použití T-SQL v SQL Server (nebo Azure) LEN()
a DATALENGTH()
funkce často vrátí stejný výsledek, ale ne vždy. Existují některé případy, kdy tyto funkce vrátí zcela odlišné výsledky pro zdánlivě stejná data. Je to proto, že existuje důležitý rozdíl mezi způsobem LEN()
a DATALENGTH()
funkce fungují, jak uvidíme zde.
Nejprve je zde rychlá definice každého z nich:
LEN()
- Vrátí počet znaků zadaného řetězcového výrazu, kromě mezer na konci.
DATALENGTH()
- Vrátí počet bajtů použitých k vyjádření jakéhokoli výrazu.
Všimněte si „znaků“ vs. „bajtů“. Všimněte si také, že „vyloučení koncových mezer“ se vztahuje pouze na jeden.
Zde je několik příkladů, které demonstrují rozdíly mezi LEN()
a DATALENGTH()
.
Koncové mezery
Jeden rozdíl mezi LEN()
a DATALENGTH()
funkce je, že LEN()
funkce nezahrnuje koncové mezery (mezery na konci, tabulátory atd.), zatímco DATALENGTH()
zahrnuje koncové mezery. Všimněte si, že mluvíme pouze o mezerách, které jsou na konci řetězce – ne na začátku nebo uprostřed.
Zde je příklad bez koncové mezery:
SELECT LEN('Lit') AS Len, DATALENGTH('Lit') AS DataLength;
Výsledek:
Len DataLength --- ---------- 3 3
A zde je příklad s koncové mezery:
SELECT LEN('Lit ') AS Len, DATALENGTH('Lit ') AS DataLength;
Výsledek:
Len DataLength --- ---------- 3 4
Úvodní mezery však počítají obě funkce:
SELECT LEN(' Lit') AS Len, DATALENGTH(' Lit') AS DataLength;
Výsledek:
Len DataLength --- ---------- 4 4
Bajty vs. znaky
Další klíčový rozdíl mezi LEN()
a DATALENGTH()
je to LEN()
funkce vrací počet znaků v řetězci. Na druhé straně DATALENGTH()
vrátí počet bajtů ve výrazu.
To je důležitý rozdíl, protože počet bajtů ve výrazu nemusí nutně odpovídat počtu znaků v řetězci. Při zpracování řetězce unicode DATALENGTH()
vrátí dvojnásobný počet znaků. Je to proto, že řetězec unicode uchovává 2 bajty na znak.
Ve výše uvedeném příkladu jsme viděli, že oba LEN()
a DATALENGTH()
vrátil stejný výsledek pro slovo Lit
(
3
). Jakmile však začneme dotazovat databázi, bude výsledek záviset na tom, jak jsou data uložena. Pokud je například uložen jako varchar , výsledky budou stejné. Pokud je uložen jako nvarchar DATALENGTH()
funkce vrátí dvojnásobný počet znaků. A pokud je uložen, řekněme, char(25) , DATALENGTH()
vrátí přesně 25 znaků.
Příklady
Spusťte následující dotaz:
SELECT ArtistName, LEN(ArtistName) AS Len, DATALENGTH(ArtistName) AS DataLength FROM Artists WHERE ArtistName = 'Lit';
Výsledky tohoto dotazu budou záviset na tom, jak jsou data uložena.
nvarchar(255)
Pokud ArtistName
sloupec ukládá data jako nvarchar(255) :
ArtistName Len DataLength ---------- --- ---------- Lit 3 6
varchar(255)
Pokud tento sloupec změníme na varchar(255) , dostaneme následující výsledek:
ArtistName Len DataLength ---------- --- ---------- Lit 3 3
znak(25)
Pokud tento sloupec změníme na char(25) , dostaneme následující výsledek:
ArtistName Len DataLength ------------------------- --- ---------- Lit 3 25
Takže možná morální pro toto všechno je, že pokud zjistíte, že dostáváte divné výsledky při pokusu o načtení délek řetězců atd., zkontrolujte, zda používáte správnou funkci.