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.