首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >datetime2存储大小

datetime2存储大小
EN

Stack Overflow用户
提问于 2012-08-21 18:56:50
回答 2查看 3.9K关注 0票数 6

使用Server 2008 R2,SP2 文档表示datetime2需要6、7或8个字节,这取决于您使用的女巫精度

我需要以二进制形式存储大量数据(级联值),而且我喜欢每次只使用6个字节的想法,但是当我尝试:

代码语言:javascript
复制
declare @_dt_p0 datetime2(0) = '2012-05-18 11:22:33'
select  CONVERT(varbinary, @_dt_p0), LEN(CONVERT(varbinary, @_dt_p0))

declare @_dt_p4 datetime2(4) = '2012-05-18 11:22:33'
select  CONVERT(varbinary, @_dt_p4), LEN(CONVERT(varbinary, @_dt_p4))

declare @_dt_p7 datetime2(7) = '2012-05-18 11:22:33'
select  CONVERT(varbinary, @_dt_p7), LEN(CONVERT(varbinary, @_dt_p7))

很明显,这是一个额外的字节,我做错了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-21 19:20:41

我想我无法解释为什么变量转换的长度/数据长度是7而不是6 (Mikael后来发现了转换为var二进制文件会将精度增加为额外的字节。),但我不知道为什么您认为这是一个有效的测试。当您使用实际的列时,我可以确认在页面上存储了6个字节(尽管根据该列是否为空,该行的空开销将有所不同)。我怎么才能证明?

代码语言:javascript
复制
USE tempdb;
GO

CREATE TABLE dbo.x
(
 d1 DATETIME2(0)  NULL, 
 v1 VARBINARY(32) NULL,
 d2 DATETIME2(0)  NOT NULL, 
 v2 VARBINARY(32) NOT NULL
);

declare @d datetime2(0) = '2012-05-18 11:22:33';

INSERT dbo.x(d1, v1, d2, v2)
SELECT @d, CONVERT(VARBINARY(32), @d), @d, CONVERT(VARBINARY(32), @d);

SELECT DATALENGTH(d1), DATALENGTH(v1), 
       DATALENGTH(d2), DATALENGTH(v2) FROM dbo.x;

结果:

代码语言:javascript
复制
6    7    6    7

因此,datetime2列是6个字节,而var二进制列是7个字节。不管是空还是空。我们可以通过实际检查页面来更仔细地查看。让我们为这个表找到堆中的所有页面:

代码语言:javascript
复制
DBCC IND('tempdb', 'dbo.x', 0);

我的系统的部分结果(你的会有所不同):

代码语言:javascript
复制
PagePID  PageType
283      10
311      1

现在让我们看看第311页:

代码语言:javascript
复制
DBCC TRACEON(3604, -1);
DBCC PAGE(2, 1, 311, 3);

我们可以看到,datetime2列确实占据了页面上的6个字节:

代码语言:javascript
复制
Slot 0 Column 1 Offset 0x4 Length 6 Length (physical) 6

d1 = 2012-05-18 11:22:33            

v1 = [Binary data] Slot 0 Column 2 Offset 0x19 Length 7 Length (physical) 7
v1 = 0x00f99f00b0350b               

Slot 0 Column 3 Offset 0xa Length 6 Length (physical) 6

d2 = 2012-05-18 11:22:33            

v2 = [Binary data] Slot 0 Column 4 Offset 0x20 Length 7 Length (physical) 7
v2 = 0x00f99f00b0350b              
票数 10
EN

Stack Overflow用户

发布于 2015-05-10 08:46:22

日安,

首先,我想说,这是最好的问题:“我不知道你为什么认为这是一个有效的测试无论如何”,因为答案是这是无效的测试

您可以阅读有关这个问题的所有内容,包括对DateTime2实际存储格式的解释,以及为什么检查“转换为二进制”的结果并假设这与实际存储的数据相同是错误的!它在可变长度的数据(如varchar或nvarchar )中不准确,在DateTime2中也不准确。检查和获取实际存储格式的唯一方法是使用DBCC页检查数据本身。http://ariely.info/Blog/tabid/83/EntryId/162/Examine-how-DateTime2-type-stored-in-the-data-file.aspx

我希望这是有用的:-)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12061276

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档