这个MSDN页面指出:
这是否意味着可空行版本列与可空二进制(8)列在语义上不等价?
我的具体示例是,我将有一个包含来自其他表的行副本的表格。某些源表具有 rowversion,而其他源表则没有。因此,我的表中的“rowversion”列必须接受空值。我想了解为什么(或如果有必要),该列应为 varbinary(8) null 而不是 binary(8) null。
既然非空 rowversion 列在语义上等同于 binary(8) 列,为什么要说可空 rowversion 列在语义上等同于 varbinary(8)列而不是可空的 binary(8)列呢?非空 rowversion 列在语义上等同于 binary(8) 列。可空 rowversion 列在语义上等同于 varbinary(8) 列。
这是否意味着可空行版本列与可空二进制(8)列在语义上不等价?
我的具体示例是,我将有一个包含来自其他表的行副本的表格。某些源表具有 rowversion,而其他源表则没有。因此,我的表中的“rowversion”列必须接受空值。我想了解为什么(或如果有必要),该列应为 varbinary(8) null 而不是 binary(8) null。
binary(8)
的列将始终包含 8 个字节的存储空间 - 不管里面存储了什么 - 即使是NULL
。然而,其可为空的版本 -varbinary(8)
- 只会占用实际需要的空间(加上一些开销)。 - marc_sROWVERSION 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 Smithbinary
,因为varbinary
有两个额外的字节开销,但如果大多数为空,则可以节省空间。那么,“@Ɖiamond ǤeezeƦ”这个字段的值占多少行的百分比呢? - Martin Smithvarbinary
数据类型的开销25%,那么我会选择varbinary(8)
。 - marc_s