Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

LEN() vs DATALENGTH() no SQL Server


Ao usar o T-SQL no SQL Server (ou Azure), o LEN()DATALENGTH() As funções geralmente retornam o mesmo resultado, mas nem sempre. Existem alguns casos em que essas funções retornarão resultados completamente diferentes para o que parecem ser os mesmos dados. Isso ocorre porque há uma diferença importante entre como o LEN()DATALENGTH() funções funcionam, como veremos aqui.

Primeiro, aqui está uma definição rápida de cada um:
LEN()
Retorna o número de caracteres da expressão de string especificada, excluindo espaços em branco à direita.
DATALENGTH()
Retorna o número de bytes usados ​​para representar qualquer expressão.

Observe “caracteres” versus “bytes”. Observe também que “excluindo espaços em branco à direita” se aplica apenas a um.

Veja alguns exemplos para demonstrar as diferenças entre LEN()DATALENGTH() .

Brancos à direita


Uma diferença entre o LEN()DATALENGTH() funções é que LEN() função exclui espaços em branco à direita (espaços à direita, tabulações etc.) enquanto DATALENGTH() inclui espaços em branco à direita. Observe que estamos falando apenas de espaços em branco que vêm no final da corda – não no início ou no meio.

Aqui está um exemplo sem espaços em branco à direita:
SELECT 
    LEN('Lit') AS Len,
    DATALENGTH('Lit') AS DataLength;

Resultado:
Len  DataLength
---  ----------
3    3   

E aqui está um exemplo com espaços em branco à direita:
SELECT 
    LEN('Lit ') AS Len,
    DATALENGTH('Lit ') AS DataLength;

Resultado:
Len  DataLength
---  ----------
3    4  

No entanto, os espaços iniciais são contados por ambas as funções:
SELECT 
    LEN(' Lit') AS Len,
    DATALENGTH(' Lit') AS DataLength;

Resultado:
Len  DataLength
---  ----------
4    4         

Bytes x Caracteres


Outra diferença importante entre LEN()DATALENGTH() é que LEN() função retorna o número de caracteres em uma corda. Por outro lado, DATALENGTH() retorna o número de bytes em uma expressão.

Essa é uma distinção importante porque o número de bytes em uma expressão não corresponde necessariamente ao número de caracteres na string. Ao processar uma string unicode, DATALENGTH() retornará o dobro do número de caracteres. Isso ocorre porque uma string unicode armazena 2 bytes por caractere.

No exemplo acima, vimos que LEN()DATALENGTH() retornou o mesmo resultado para a palavra Lit ( 3 ). Mas, uma vez que começamos a consultar um banco de dados, o resultado dependerá de como os dados são armazenados. Por exemplo, se estiver armazenado como varchar , os resultados serão os mesmos. Se estiver armazenado como nvarcharDATALENGTH() A função retornará o dobro do número de caracteres. E se for armazenado como, digamos, char(25)DATALENGTH() retornará exatamente 25 caracteres.

Exemplos


Vamos executar a seguinte consulta:
SELECT 
    ArtistName, 
    LEN(ArtistName) AS Len,
    DATALENGTH(ArtistName) AS DataLength
FROM Artists 
WHERE ArtistName = 'Lit';

Os resultados dessa consulta dependerão de como os dados são armazenados.

nvarchar(255)


Se o ArtistName a coluna armazena dados como nvarchar(255) :
ArtistName  Len  DataLength
----------  ---  ----------
Lit         3    6         

varchar(255)


Se alterarmos essa coluna para varchar(255) , obtemos o seguinte resultado:
ArtistName  Len  DataLength
----------  ---  ----------
Lit         3    3         

caracter(25)


Se alterarmos essa coluna para char(25) , obtemos o seguinte resultado:
ArtistName                 Len  DataLength
-------------------------  ---  ----------
Lit                        3    25        

Então, talvez a moral de tudo isso seja, se você encontrar resultados estranhos ao tentar recuperar comprimentos de string etc., verifique se está usando a função correta.