De acordo com o BOL para SQL Server 2008 R2, o tipo de dados decimal requer os seguintes bytes de armazenamento:
Precision Storage bytes
1 - 9 => 5
10-19 => 9
20-28 => 13
29-38 => 17
No entanto, quando faço um datalength() em uma coluna formatada como decimal(19,5) e tem o valor de 10999,99999, recebo de volta 5 bytes? Que no meu entendimento é uma precisão de 10 e não de 9 e deve resultar em 9 bytes.
isso resulta em duas perguntas:
o tamanho da tabela com esta coluna não depende da definição da coluna, em vez disso, os valores verdadeiros dentro da coluna definem o tamanho da tabela?
por que as informações em BOL não correspondem ao que datalength () retorna?
Não misture armazenamento (5 ou 9 bytes) e o que você recebe de volta
Em uma coluna decimal (19,5), são sempre 9 bytes no disco. Portanto, zero ocupará nove bytes.
Seu
10999.99999
é apenas uma representação desse número armazenado que é analisado como 10999.99999 por DATALENGTHEditar:
DATALENGTH retornará o número de bytes necessários para armazenar a expressão fornecida. Ele ignora o tipo de dados principalmente. Portanto,
10999.99999
é tratado como decimal (10,5), que pode ser armazenado em 5 bytes, não em 9, como Martin apontou em um comentário.Portanto, uma coluna decimal (19,5) tem sempre 9 bytes. DATALENGTH não se importa. Ele olha para a expressão
10999.99999
e decide que ela pode ser armazenada em 5 bytes. Mas claro que não podePessoalmente, nunca usei DATALENGTH, exceto para encontrar espaços à direita ou algo assim.
Basicamente, não use DATALENGTH em tipos de dados não string.
Nota: LEN informa quanto tempo a representação de string é