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 个字节。
这导致两个问题:
具有此列的表的大小是否不取决于列定义,而是列中的真实值定义了表大小?
为什么 BOL 中的信息与 datalength() 返回的信息不匹配?
不要混合存储(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)
归档时间: |
|
查看次数: |
21427 次 |
最近记录: |