Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

LEN() срещу DATALENGTH() в SQL Server

Когато използвате 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        

Така че може би моралът на всичко това е, ако установите, че получавате странни резултати, когато се опитвате да извлечете дължини на низове и т.н., проверете дали използвате правилната функция.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да зададете име на първичен ключ в EF-Code-First

  2. CONVERT() в SQL Server

  3. Как да изпълним SSIS пакет от .NET?

  4. Намерете най-малкото неизползвано число в SQL Server

  5. Функция LEN, която не включва крайни интервали в SQL Server