sql >> Databáze >  >> RDS >> Sqlserver

LEN() vs DATALENGTH() na serveru SQL

Při použití T-SQL v SQL Server (nebo Azure) LEN()DATALENGTH() funkce často vrátí stejný výsledek, ale ne vždy. Existují některé případy, kdy tyto funkce vrátí zcela odlišné výsledky pro zdánlivě stejná data. Je to proto, že existuje důležitý rozdíl mezi způsobem LEN()DATALENGTH() funkce fungují, jak uvidíme zde.

Nejprve je zde rychlá definice každého z nich:

LEN()
Vrátí počet znaků zadaného řetězcového výrazu, kromě mezer na konci.
DATALENGTH()
Vrátí počet bajtů použitých k vyjádření jakéhokoli výrazu.

Všimněte si „znaků“ vs. „bajtů“. Všimněte si také, že „vyloučení koncových mezer“ se vztahuje pouze na jeden.

Zde je několik příkladů, které demonstrují rozdíly mezi LEN()DATALENGTH() .

Koncové mezery

Jeden rozdíl mezi LEN()DATALENGTH() funkce je, že LEN() funkce nezahrnuje koncové mezery (mezery na konci, tabulátory atd.), zatímco DATALENGTH() zahrnuje koncové mezery. Všimněte si, že mluvíme pouze o mezerách, které jsou na konci řetězce – ne na začátku nebo uprostřed.

Zde je příklad bez koncové mezery:

SELECT 
    LEN('Lit') AS Len,
    DATALENGTH('Lit') AS DataLength;

Výsledek:

Len  DataLength
---  ----------
3    3   

A zde je příklad s koncové mezery:

SELECT 
    LEN('Lit ') AS Len,
    DATALENGTH('Lit ') AS DataLength;

Výsledek:

Len  DataLength
---  ----------
3    4  

Úvodní mezery však počítají obě funkce:

SELECT 
    LEN(' Lit') AS Len,
    DATALENGTH(' Lit') AS DataLength;

Výsledek:

Len  DataLength
---  ----------
4    4         

Bajty vs. znaky

Další klíčový rozdíl mezi LEN()DATALENGTH() je to LEN() funkce vrací počet znaků v řetězci. Na druhé straně DATALENGTH() vrátí počet bajtů ve výrazu.

To je důležitý rozdíl, protože počet bajtů ve výrazu nemusí nutně odpovídat počtu znaků v řetězci. Při zpracování řetězce unicode DATALENGTH() vrátí dvojnásobný počet znaků. Je to proto, že řetězec unicode uchovává 2 bajty na znak.

Ve výše uvedeném příkladu jsme viděli, že oba LEN()DATALENGTH() vrátil stejný výsledek pro slovo Lit ( 3 ). Jakmile však začneme dotazovat databázi, bude výsledek záviset na tom, jak jsou data uložena. Pokud je například uložen jako varchar , výsledky budou stejné. Pokud je uložen jako nvarchar  DATALENGTH() funkce vrátí dvojnásobný počet znaků. A pokud je uložen, řekněme, char(25)DATALENGTH() vrátí přesně 25 znaků.

Příklady

Spusťte následující dotaz:

SELECT 
    ArtistName, 
    LEN(ArtistName) AS Len,
    DATALENGTH(ArtistName) AS DataLength
FROM Artists 
WHERE ArtistName = 'Lit';

Výsledky tohoto dotazu budou záviset na tom, jak jsou data uložena.

nvarchar(255)

Pokud ArtistName sloupec ukládá data jako nvarchar(255) :

ArtistName  Len  DataLength
----------  ---  ----------
Lit         3    6         

varchar(255)

Pokud tento sloupec změníme na varchar(255) , dostaneme následující výsledek:

ArtistName  Len  DataLength
----------  ---  ----------
Lit         3    3         

znak(25)

Pokud tento sloupec změníme na char(25) , dostaneme následující výsledek:

ArtistName                 Len  DataLength
-------------------------  ---  ----------
Lit                        3    25        

Takže možná morální pro toto všechno je, že pokud zjistíte, že dostáváte divné výsledky při pokusu o načtení délek řetězců atd., zkontrolujte, zda používáte správnou funkci.


  1. SQL aktualizační dotaz pomocí spojení

  2. Jak získám protokolování psycopg2 doby provádění dotazu?

  3. Nelze se připojit k místnímu serveru MySQL přes soket '/var/lib/mysql/mysql.sock' (2)

  4. Zkoumání chyby ORA 02063 DG4ODBC