Len () vs datalength () no SQL Server 2005
-
18-09-2019 - |
Pergunta
Recentemente eu enfrentei um problema quando usando len()
em uma consulta para descobrir o comprimento de uma consulta, len()
não estava contando os espaços à direita no valor. Mas datalength()
está contando os espaços à direita também.
Será que isso significa que, se eu estou fazendo alguma operação que lida com o comprimento real do valor, então eu tenho que usar dalalength()
sobre len()
.
ex: Se eu precisar o valor de um determinado valor a ser é de 10 comprimento de caracteres. ou seja, se o valor é de 3 comprimento de caracteres Eu tenho de acrescentar 7 espaços para ele.
Solução
Sim, isso é exatamente o que você deve fazer. Se você quer apenas obter o número de caracteres excluindo espaços em branco que você usaria função LEN()
, enquanto em todos os outros casos DATALENGTH()
.
Mesmo documentação LEN()
tem uma informação que, para obter o número de bytes para representar a extensão que você deve usar DATALENGTH()
Aqui estão os links para documentação do MSDN:
Outras dicas
Tenha cuidado. DATALENGTH devolve o número de bytes utilizado, e não o número de caracteres.
contagem len o número de caracteres não utilizados no armazenamento necessário, este será ainda mais evidente quando você usar nvarchar em vez de varchar
len não conta com espaços a qualquer
dar uma olhada nesta ??p>
declare @v nchar(5)
select @v ='ABC '
select len(@v),datalength(@v)
e a saída para o len é 3, enquanto a saída para datalength = 10
Apenas uso Substituir ():
SELECT LEN(REPLACE(N'4 Trailing Spaces: ', ' ', '_'))
Isto irá substituir espaços à direita, com um personagem que LEN () vai realmente contar.
O problema com DataLength () é que você tem que manter o controle de wether a cadeia é Unicode (nChar, nVarChar) ou ASCII (Char, VarChar) para saber se você também precisa dividir o datalength de uma seqüência de caracteres Unicode por 2.
Eu estava prestes a usar o Len (Replace ( 'blá blá','', '_') sugestão quando ele me surpreendeu, pode ser mais eficiente para uso. Apenas postar no caso de alguém se depara com esta discussão como eu fiz.
LEN ( 'blá blá' + '') - 1
Infelizmente não há nenhuma solução perfeita que eu estou ciente.
Uma das soluções propostas, LEN(string + '.')-1
retorna resultados errados (-1) se a cadeia é Unicode de tamanho 4000 ou não-Unicode e de tamanho 8000. Isso porque a concatenação é ignorado. Você pode superar isso, se quiser, lançando a string para uma string MAX-size:? LEN(CAST(string as nvarchar(max)) + '.')-1
, mas vale a pena
Como mencionado por outros, DATALENGTH(string)
retorna o número de bytes usados ??para o armazenamento. Para cadeias de caracteres Unicode, pode não ser suficiente para dividir o resultado por 2: Unicode substituto caracteres pode demorar mais de 16 bits.
Ao todo, estar consciente das limitações de cada abordagem e escolher o que você acha que vai lhe causar menos problemas.