Ao usar o T-SQL no SQL Server (ou Azure), o
LEN()
e 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()
e 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()
e DATALENGTH()
.Brancos à direita
Uma diferença entre o
LEN()
e 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()
e 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()
e 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 nvarchar o DATALENGTH()
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.