为什么可空的rowversion列在语义上等同于varbinary(8)?

7
这个MSDN页面指出:

非空 rowversion 列在语义上等同于 binary(8) 列。可空 rowversion 列在语义上等同于 varbinary(8) 列。

既然非空 rowversion 列在语义上等同于 binary(8) 列,为什么要说可空 rowversion 列在语义上等同于 varbinary(8)列而不是可空的 binary(8)列呢?
这是否意味着可空行版本列与可空二进制(8)列在语义上不等价?
我的具体示例是,我将有一个包含来自其他表的行副本的表格。某些源表具有 rowversion,而其他源表则没有。因此,我的表中的“rowversion”列必须接受空值。我想了解为什么(或如果有必要),该列应为 varbinary(8) null 而不是 binary(8) null。

2
一个类型为 binary(8) 的列将始终包含 8 个字节的存储空间 - 不管里面存储了什么 - 即使是 NULL。然而,其可为空的版本 - varbinary(8) - 只会占用实际需要的空间(加上一些开销)。 - marc_s
3
我认为这里的文档有误。即使表被声明为 ROWVERSION NULL,它也存储在行的固定长度部分中。@marc_s 它会是 null 吗?CREATE TABLE #T(C ROWVERSION NULL);INSERT INTO #T VALUES(NULL);SELECT * FROM #T;DROP TABLE #T 尽管显式插入了 NULL,但仍会返回一个 NOT NULL 值。 - Martin Smith
2
@marc_s 抱歉,我想我明白你原来的评论意图了。在OP的目标表中,如果他们希望大多数为“NOT NULL”,则应声明binary,因为varbinary有两个额外的字节开销,但如果大多数为空,则可以节省空间。那么,“@Ɖiamond ǤeezeƦ”这个字段的值占多少行的百分比呢? - Martin Smith
2
@ƉiamondǤeezeƦ:我想只要你的使用率高于varbinary数据类型的开销25%,那么我会选择varbinary(8) - marc_s
我的猜测是,即使您无法将Null放入rowversion中,您仍然可以将其定义为可空或不可空。因此,可以在内部区分这两种情况,因此可空ROWVERSION为varbinary,而不可空ROWVERSION为二进制。 - nimdil
显示剩余5条评论
1个回答

1

二进制(8)是恰好有8个字节的二进制。 可变长度二进制(8)是最多有8个字节的二进制。 空值为0字节。 它必须是可以有0或8个字节的形式。 因此,它必须是可变长度二进制。


恩...我不相信。具体来说,我可以拥有一个可空的二进制(8)(或任何其他固定宽度数据类型)。 - Ben Thul
有什么不值得购买的呢?空值在数据行的单独字节上以单个位记录。第一个可为空的列会向存储添加一个字节,每隔八个可为空的列会向存储添加一个字节。'Nullness' 象征性地存储在行的 'header' 上。一旦为 null 添加了该位,它就具有与 varbinary 相同的存储方式。 - jerrylagrou
1
我想说的是,列的可空特性和它是否是可变长度列是正交概念。就这个情况而言,为什么rowversion列的可空性必须意味着它是varbinary(8) NULL而不是binary(8) null?前者意味着它可以是任何长度(包括)最多8个字节的二进制值(或null),而后者则意味着它可以是8个字节的二进制值(或null)。 - Ben Thul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接