我试图更好地理解 SQL 中的数字类型,并且已经读到十进制类型总是需要 17 个字节。但是,MS Docs列出了一个表,指示使用的空间量取决于小数点的精度。所以我尝试使用该datalength
功能对其进行测试。
create table tbl_TestDec(dec1 decimal(19,4), dec2 decimal(20,4), dec3 decimal(9,4))
insert into tbl_TestDec
select 1, 1, 1
select datalength(dec1), datalength(dec2), datalength(dec3) from tbl_TestDec
这输出:
5 5 5
我期待要么9 13 5
要么17 17 17
。我正在使用 SQL Server 2005。所有小数都是 vardecimal 还是我误解了 datalength 函数?
DATALENGTH
返回传递给它的值的内部表示的大小(以字节为单位)。它不会返回所需的存储大小(这可能取决于您存储它的位置),也不会返回可能存储在该类型中的最大数据大小。
例如(dbfiddle 演示):
给出:
我认为您会在使用 Vardecimal 存储格式减少数据库大小中找到很多关于此主题的有趣信息,但要回答您的问题(引用帖子,突出显示我的):
尝试以更高的精度插入值,您的结果将会改变。
另一个注意事项:
您可以在数据库和表级别启用 Vardecimal 存储。使用 SSMS 对象资源管理器,您可以查看数据库选项和表存储属性以验证是否启用了 Vardecimal 存储。您还可以使用
sp_db_vardecimal_storage_format
, 注释:也就是说,企业专用的 vardecimal 存储在 SQL Server 2008中被弃用,取而代之的是行压缩,这是vardecimal 存储功能的超集。从 SQL Server 2016 SP1 开始,行和页数据压缩在所有版本中都可用,并且不需要数据库配置选项即可使用。