WEB开发网
开发学院数据库MSSQL Server BIT类型在SQL Server中的存储大小 阅读

BIT类型在SQL Server中的存储大小

 2008-08-26 09:56:02 来源:WEB开发网   
核心提示:对于一般的INT、CHAR、tinyint等数据类型,他们占用的存储空间都是以Byte字节为单位的,BIT类型在SQL Server中的存储大小,但是BIT类型由于只有0和1或者说false和true,这种情况只需要一个Bit位就可以表示了,而且不是BIT类型,所以c1和c3之间必须留出一个字节来存储c2,那么在SQL

对于一般的INT、CHAR、tinyint等数据类型,他们占用的存储空间都是以Byte字节为单位的,但是BIT类型由于只有0和1或者说false和true,这种情况只需要一个Bit位就可以表示了,那么在SQL Server中BIT类型到底占用了多少空间?是不是由一个Bit位来存储的?或者可能是使用一个字节来存储的?

这两个答案都不正确!实际上BIT类型占用的空间与BIT类型的列所在表的位置有关,有些情况下BIT占用了一个字节,有些情况下BIT实际占用了几个位(几个BIT类型的列共用一个字节)。下面就来具体分析一下:

1. 单独的BIT类型的列将占用一个字节。

所谓单独就是指一个BIT类型的列的左边定长列和右边定长列都不是BIT类型的列。例如这样一个表:

  CREATETABLEtt
  (
  c1INTPRIMARYKEY,
  c2BITNOTNULL,
  c3CHAR(2)NOTNULL
  )

SQL Server在存储表中的数据时先是将表中的列按照原有顺序分为定长和变长(变长就是长度不固定的数据类型,如varchar,nvarchar,varbinary等)两组。在数据页中存储数据时先存储所有定长的数据,然后再存储变长的数据。这里由于c2列的左边是int类型,右边是char类型,都是定长的,而且不是BIT类型,所以c1和c3之间必须留出一个字节来存储c2,虽然c2只用到了其中的一个位。

下面我们来验证一下是否真是如我所说:

(1)插入一行数据:

INSERTINTOttVALUES(1,1,'aa')

(2)找到tt表数据的第一页(也就是刚才插入的这行数据所在页)的文件号和页面号:

   SELECTfirst_page
  FROMsys.partitionsp
  INNERJOINsys.system_internals_allocation_unitsa
  ONp.partition_id=a.container_id
  WHEREOBJECT_ID=OBJECT_ID('dbo.tt')

1 2 3  下一页

Tags:BIT 类型 SQL

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接