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.