W przypadku korzystania z T-SQL na serwerze SQL Server (lub na platformie Azure) funkcja LEN()
i DATALENGTH()
funkcje często zwracają ten sam wynik, ale nie zawsze. W niektórych przypadkach te funkcje zwrócą zupełnie inne wyniki dla tego, co wydaje się być tymi samymi danymi. Dzieje się tak, ponieważ istnieje ważna różnica między sposobem LEN()
i DATALENGTH()
funkcje działają, jak zobaczymy tutaj.
Po pierwsze, oto krótka definicja każdego z nich:
LEN()
- Zwraca liczbę znaków określonego wyrażenia łańcuchowego, z wyłączeniem końcowych spacji.
DATALENGTH()
- Zwraca liczbę bajtów używanych do reprezentowania dowolnego wyrażenia.
Zwróć uwagę na „znaki” kontra „bajty”. Pamiętaj również, że „wykluczenie końcowych spacji” dotyczy tylko jednego.
Oto kilka przykładów pokazujących różnice między LEN()
i DATALENGTH()
.
Bluzy końcowe
Jedna różnica między LEN()
i DATALENGTH()
funkcji polega na tym, że LEN()
funkcja wyklucza końcowe spacje (końcowe spacje, tabulatory itp.), podczas gdy DATALENGTH()
zawiera końcowe puste miejsca. Uwaga, mówimy tylko o odstępach, które pojawiają się na końcu sznurka – nie na początku ani w środku.
Oto przykład bez końcowe spacje:
SELECT LEN('Lit') AS Len, DATALENGTH('Lit') AS DataLength;
Wynik:
Len DataLength --- ---------- 3 3
A oto przykład z końcowe spacje:
SELECT LEN('Lit') AS Len, DATALENGTH('Lit') AS DataLength;
Wynik:
Len DataLength --- ---------- 3 4
Jednak spacje wiodące są liczone przez obie funkcje:
SELECT LEN('Lit') AS Len, DATALENGTH('Lit') AS DataLength;
Wynik:
Len DataLength --- ---------- 4 4
Bajty a znaki
Kolejna kluczowa różnica między LEN()
i DATALENGTH()
jest to, że LEN()
funkcja zwraca liczbę znaków w sznurku. Z drugiej strony DATALENGTH()
zwraca liczbę bajtów w wyrażeniu.
Jest to ważne rozróżnienie, ponieważ liczba bajtów w wyrażeniu niekoniecznie odpowiada liczbie znaków w ciągu. Podczas przetwarzania ciągu Unicode, DATALENGTH()
zwróci dwukrotność liczby znaków. Dzieje się tak, ponieważ ciąg znaków Unicode przechowuje 2 bajty na znak.
W powyższym przykładzie zauważyliśmy, że LEN()
i DATALENGTH()
zwrócił ten sam wynik dla słowa Lit
(
3
). Ale kiedy zaczniemy przeszukiwać bazę danych, wynik będzie zależał od sposobu przechowywania danych. Na przykład, jeśli jest przechowywany jako varchar , wyniki będą takie same. Jeśli jest przechowywany jako nvarchar DATALENGTH()
funkcja zwróci dwukrotność liczby znaków. A jeśli jest przechowywany jako powiedzmy, char(25) , DATALENGTH()
zwróci dokładnie 25 znaków.
Przykłady
Uruchommy następujące zapytanie:
SELECT ArtistName, LEN(ArtistName) AS Len, DATALENGTH(ArtistName) AS DataLength FROM Artists WHERE ArtistName = 'Lit';
Wyniki tego zapytania będą zależeć od sposobu przechowywania danych.
nvarchar(255)
Jeśli ArtistName
kolumna przechowuje dane jako nvarchar(255) :
ArtistName Len DataLength ---------- --- ---------- Lit 3 6
varchar(255)
Jeśli zmienimy tę kolumnę na varchar(255) , otrzymujemy następujący wynik:
ArtistName Len DataLength ---------- --- ---------- Lit 3 3
znak(25)
Jeśli zmienimy tę kolumnę na char(25) , otrzymujemy następujący wynik:
ArtistName Len DataLength ------------------------- --- ---------- Lit 3 25
Więc być może morał w tym wszystkim jest taki, że jeśli zauważysz dziwne wyniki podczas próby pobrania długości ciągów itp., sprawdź, czy używasz właściwej funkcji.