Когато използвате T-SQL в SQL Server (или Azure), LEN()
и DATALENGTH()
функциите често връщат един и същ резултат, но не винаги. Има някои случаи, в които тези функции ще върнат напълно различни резултати за това, което изглежда, че са едни и същи данни. Това е така, защото има важна разлика между това как LEN()
и DATALENGTH()
функциите работят, както ще видим тук.
Първо, ето кратко определение на всеки от тях:
LEN()
- Връща броя на знаците на посочения низов израз, с изключение на крайните празни места.
DATALENGTH()
- Връща броя на байтовете, използвани за представяне на произволен израз.
Забележете „символи“ срещу „байтове“. Също така имайте предвид, че „с изключение на крайните празни места“ се отнася само за едно.
Ето няколко примера за демонстриране на разликите между LEN()
и DATALENGTH()
.
Завършващи празни места
Една разлика между LEN()
и DATALENGTH()
функции е, че LEN()
функция изключва крайни празни места (завършващи интервали, табулатори и т.н.), докато DATALENGTH()
включва крайни заготовки. Имайте предвид, че говорим само за празни места, които идват в края на низа – не в началото или в средата.
Ето пример без крайни празни места:
SELECT LEN('Lit') AS Len, DATALENGTH('Lit') AS DataLength;
Резултат:
Len DataLength --- ---------- 3 3
И ето пример с крайни празни места:
SELECT LEN('Lit') AS Len, DATALENGTH('Lit') AS DataLength;
Резултат:
Len DataLength --- ---------- 3 4
Въпреки това, водещите интервали се броят от двете функции:
SELECT LEN(' Lit') AS Len, DATALENGTH(' Lit') AS DataLength;
Резултат:
Len DataLength --- ---------- 4 4
Байтове срещу знаци
Друга ключова разлика между LEN()
и DATALENGTH()
това е LEN()
функцията връща броя на знаците в низ. От друга страна, DATALENGTH()
връща броя на байтовете в израз.
Това е важно разграничение, тъй като броят на байтовете в израза не съвпада непременно с броя на знаците в низа. Когато обработвате Unicode низ, DATALENGTH()
ще върне два пъти по-голям брой знаци. Това е така, защото Unicode низ съхранява 2 байта на знак.
В горния пример видяхме, че и двете LEN()
и DATALENGTH()
върна същия резултат за думата Lit
(
3
). Но след като започнем да правим заявки към база данни, резултатът ще зависи от това как се съхраняват данните. Например, ако се съхранява като varchar , резултатите ще бъдат същите. Ако се съхранява като nvarchar DATALENGTH()
функцията ще върне два пъти по-голям брой знаци. И ако се съхранява като да речем, char(25) , DATALENGTH()
ще върне точно 25 знака.
Примери
Нека изпълним следната заявка:
SELECT ArtistName, LEN(ArtistName) AS Len, DATALENGTH(ArtistName) AS DataLength FROM Artists WHERE ArtistName = 'Lit';
Резултатите от тази заявка ще зависят от това как се съхраняват данните.
nvarchar(255)
Ако ArtistName
колоната съхранява данни като nvarchar(255) :
ArtistName Len DataLength ---------- --- ---------- Lit 3 6
varchar(255)
Ако променим тази колона на varchar(255) , получаваме следния резултат:
ArtistName Len DataLength ---------- --- ---------- Lit 3 3
char(25)
Ако променим тази колона на char(25) , получаваме следния резултат:
ArtistName Len DataLength ------------------------- --- ---------- Lit 3 25
Така че може би моралът на всичко това е, ако установите, че получавате странни резултати, когато се опитвате да извлечете дължини на низове и т.н., проверете дали използвате правилната функция.