Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

LEN() vs DATALENGTH() w SQL Server

W przypadku korzystania z T-SQL na serwerze SQL Server (lub na platformie Azure) funkcja LEN()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()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()DATALENGTH() .

Bluzy końcowe

Jedna różnica między LEN()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()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()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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Połącz SAP IQ z SQL Server

  2. TSQL:Utwórz widok, który ma dostęp do wielu baz danych

  3. Jaki jest cel używania OPTION(MAXDOP 1) w SQL Server?

  4. Konsolidacja wystąpienia programu SQL Server za pomocą klastrowania i tworzenia stosów

  5. Jak serializować duży wykres obiektu .NET do obiektu BLOB programu SQL Server bez tworzenia dużego bufora?