数据类型为十进制的列大小

noj*_*lag 7 sql-server-2008 sql-server datatypes

根据 SQL Server 2008 R2 的 BOL,数据类型十进制需要以下存储字节:

Precision  Storage bytes

1 - 9      =>   5

10-19      => 9

20-28      => 13

29-38      => 17
Run Code Online (Sandbox Code Playgroud)

但是,当我对格式为十进制 (19,5) 且值为 10999.99999 的列执行 datalength() 时,我得到了 5 个字节?根据我的理解,精度为 10 而不是 9,应该产生 9 个字节。

这导致两个问题:

  1. 具有此列的表的大小是否不取决于列定义,而是列中的真实值定义了表大小?

  2. 为什么 BOL 中的信息与 datalength() 返回的信息不匹配?

gbn*_*gbn 7

不要混合存储(5 或 9 个字节)和你得到的东西

在十进制(19,5)列中,它在磁盘上总是9 个字节。所以零将占用九个字节。

10999.99999只是该存储数字的表示,然后由 DATALENGTH 解析为 10999.99999

编辑:

DATALENGTH 将返回存储给定表达式所需的字节数。它主要忽略数据类型。因此10999.99999被视为十进制(10,5),它可以存储在 5 个字节中,而不是像 Martin 在评论中指出的那样存储在 9 个字节中。

所以十进制(19,5)列总是9个字节。DATALENGTH 不在乎。它查看表达式10999.99999并决定它可以存储在 5 个字节中。但当然不能

就个人而言,除了查找尾随空格等之外,我从未使用过 DATALENGTH。

基本上,不要在非字符串数据类型上使用DATALENGTH

返回用于表示任何表达式的字节数。

DATALENGTH 对于 varchar、varbinary、text、image、nvarchar 和 ntext 数据类型特别有用,因为这些数据类型可以存储可变长度的数据。

注意:LEN 告诉您字符串表示的长度

DECLARE @i decimal(19,5)
SET @i ='10999.99999'
SELECT @i,LEN(@i),DATALENGTH(@i)
SET @i ='-90999.99999'
SELECT @i,LEN(@i),DATALENGTH(@i)
Run Code Online (Sandbox Code Playgroud)