Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server可空数据类型大小_Sql_Sql Server - Fatal编程技术网

SQL Server可空数据类型大小

SQL Server可空数据类型大小,sql,sql-server,Sql,Sql Server,Microsoft SQL Server DBMS中可空数据类型的大小是多少? 例如,不可为null的int应该占用4个字节,有多少空间将专用于可为null的列 子问题:可空int、char(N)、nvarchar(N)-我假设它们的存储方式可能不同 我读到的: -获取我的sql server版本的sql类型列表及其大小的好方法。但对于可为空的类型却只字不提 -有一个计算所需可变大小列空间的公式:“变量数据大小=2+(Num\u变量大小x 2)+最大值变量大小”。这很奇怪:为什么它包含*2乘法

Microsoft SQL Server DBMS中可空数据类型的大小是多少?

例如,不可为null的int应该占用4个字节,有多少空间将专用于可为null的列

子问题:可空int、char(N)、nvarchar(N)-我假设它们的存储方式可能不同

我读到的:

  • -获取我的sql server版本的sql类型列表及其大小的好方法。但对于可为空的类型却只字不提
  • -有一个计算所需可变大小列空间的公式:“变量数据大小=2+(Num\u变量大小x 2)+最大值变量大小”。这很奇怪:为什么它包含*2乘法器(没有关于nvarchar的说明-这个公式适用于所有变量大小的类型,正如解释中所述);它必须是一个打字错误,最大值的大小是增加,而不是乘以;最后,它包含+2字节用于存储值的长度,但同样不包含任何用于存储空值的内容。据我所知,可以使用值长度为2字节的剩余3位来存储空标识符,但它真的是这样存储的吗
  • -对我来说,最重要的答案令人困惑@Mark Byers说,“如果字段是固定宽度的,则存储NULL占用的空间与任何其他值相同,即字段的宽度”,但不可能将标准整数值间隔和附加NULL值存储在相同的位计数中。然后,“如果字段是可变宽度的,则空值不占用空间”-存储空值也不能占用任何空间-它必须为空值存储一些标记。与其他答案类似的困惑是:有人说它需要额外的2个字节,有人说只需要1个字节
  • -具有类型大小的漂亮表格,但同样没有专门用于空值的内容

根据Microsoft支持

  • SQL Server 2008中的空值:

    --稀疏需要额外的6个字节行大小+4个字节/非空列+值的字节(类型无关紧要)
    --常规空值需要空位图中的1位

  • SQL Server 2008中的空字符串:

    --即使输入空字符串,固定长度数据也需要完整的数据空间 --可变长度数据需要2字节的开销来存储数据 --数值上没有空字符串 --空值需要空位图中的1位


  • 参考:

    可空列和不可空列在数据页上占用完全相同的存储空间。每个数据页的一部分是空位映射,表中的每一列都有一个位,即使是不可空的列

    数据页的空位映射部分只存储可空列的位,这是一种常见的误解。事实并非如此。空位图部分包含表中所有列的可空标志。这是一个很好的解释这个神话的参考。这是另一个

    我想知道为什么SQLServer(以前是Sybase)使用这种结构。一种可能性是更改列的可空性可能是一种“Fastsh”操作。虽然所有页面上的位都发生了很大的变化,但引入新的可空字段不会导致页面拆分


    另一种可能性是,它稍微将页面上的布局与表元数据分离。虽然该页面不知道列名,但它知道基于列索引的列的所有信息。

    很好的链接,谢谢。这是我第一次听说稀疏列=)。我不确定您是否可以确认,但它真的是额外的1位,还是占用了整个字节?因为SQL Server中的位数据类型实际上使用1字节。BTW,对于稀疏列,考虑由数据类型节省的部分估计空间。@ OutkStand RPixYynyy-SQLServer将空标志位打包成字节,因此最多8个可空列仅产生1字节开销。