【发布时间】:2013-06-03 17:06:27
【问题描述】:
MSDN page 声明:
一个不可为空的 rowversion 列在语义上等价于 二进制(8)列。可为空的 rowversion 列在语义上是 相当于一个 varbinary(8) 列。
鉴于不可为空的 rowversion 列在语义上等同于 binary(8) 列,为什么说可空的 rowversion 列在语义上等同于 varbinary(8) 列而不是可空的 binary(8) 列?
这是否意味着可为空的 rowversion 列在语义上不等同于可为空的 binary(8) 列?
我的特定示例是,我将有一个包含其他表行的副本的表。一些源表具有行版本,而另一些则没有。因此,我的表中的“rowversion”列必须接受空值。我想了解为什么(或是否)该列应该是 varbinary(8) null 而不是 binary(8) null。
【问题讨论】:
-
@Andomar 我更新了我的问题来解释我为什么想知道。
-
binary(8)类型的列将始终包含 8 个字节的存储空间 - 无论其中存储什么 - 甚至是NULL。一个可以为空的版本 -varbinary(8)- 但是将只占用真正需要的空间(加上一些开销)。 -
我认为这里的文档是错误的。即使表被声明为
ROWVERSION NULL,它也存储在行的固定长度部分。 @marc_s 它可以为空吗?尽管显式插入了NULL,CREATE TABLE #T(C ROWVERSION NULL);INSERT INTO #T VALUES(NULL);SELECT * FROM #T;DROP TABLE #T仍然返回NOT NULL值 -
@marc_s 对不起,我想我明白你原来的评论是什么意思。在 OP 的目标表中,如果他们希望大多数是
NOT NULL,他们应该声明binary,因为varbinary有两个字节的额外开销,但如果大多数为空,他们可以节省空间。那么@Ɖiamond ǤeezeƦ有多少行将包含此值? -
@ƉiamondǤeezeƦ:我想只要你的比例超过 25%(
varbinary数据类型的开销),我就会选择varbinary(8)
标签: sql-server database-design sqldatatypes