BIT型別在SQL Server中的儲存大小

2022-02-03 22:43:38 字數 3540 閱讀 1951

對於一般的int、char、tinyint等資料型別,他們占用的儲存空間都是以byte位元組為單位的,但是bit型別由於只有0和1或者說false和true,這種情況只需要乙個bit位就可以表示了,那麼在sql server中bit型別到底占用了多少空間?是不是由乙個bit位來儲存的?或者可能是使用乙個位元組來儲存的?

這兩個答案都不正確!!!實際上bit型別占用的空間與bit型別的列所在表的位置有關,有些情況下bit占用了乙個位元組,有些情況下bit實際占用了幾個位(幾個bit型別的列共用乙個位元組)。下面就來具體分析一下:

1. 單獨的bit型別的列將占用乙個位元組。所謂單獨就是指乙個bit型別的列的左邊定長列和右邊定長列都不是bit型別的列。例如這樣乙個表:

create

tablett(

c1 int

primary

key,

c2 bit

notnull

,c3 

char(2

) not

null

)sql server在儲存表中的資料時先是將表中的列按照原有順序分為定長和變長(變長就是長度不固定的資料型別,如varchar,nvarchar,varbinary等)兩組。在資料頁中儲存資料時先儲存所有定長的資料,然後再儲存變長的資料。這裡由於c2列的左邊是int型別,右邊是char型別,都是定長的,而且不是bit型別,所以c1和c3之間必須留出乙個位元組來儲存c2,雖然c2只用到了其中的乙個位。

下面我們來驗證一下是否真是如我所說:

(1)插入一行資料:insert into tt values(1,1,'aa')

(2)找到tt表資料的第一頁(也就是剛才插入的這行資料所在頁)的檔案號和頁面號:

select

first_page

from

sys.partitions p

inner

join

sys.system_internals_allocation_units a

onp.partition_id

=a.container_id

where

object_id

=object_id('

dbo.tt')

我這裡返回的是0x76 00 00 00 01 00,這裡需要反轉過來看0x00 01 00 00 00 76。其中前兩個位元組是檔案號,後面的是頁面號,所以檔案號是1,頁面號是118(0x76轉換成十進位制就是118)

(3)使用dbcc page命令檢視該頁的內部結構:

dbcc

traceon(

3604

)dbcc

page(testdb,1,

118,

3) 

這兒dbcc traceon(3604)表示將頁面內容直接輸出,testdb是我建立的tt表所在的資料庫,1和118前面已經說了。最後乙個是列印選項。0表示只輸出頁頭;1則不會輸出所有內容,只是輸出有資料的內容;2表示完整的輸出這個頁的內容,3則和1差不多,但是要每條記錄分別列出列的值。以下是輸出的需要關注的內容:

00000000:   10000b00 01000000 01616103 0000††††††.........aa...      

關於資料行的具體格式我就不在這裡多說了,在《sql server 2005技術內幕 儲存引擎》中有詳細介紹。我們插入的資料從第5個位元組開始,是01000000 016161。這兒01000000就是c1,由於是int型別,所以占用4個位元組。接下來01就是c2,在這裡占用了1位元組。再接下來6161就是c3了。

create

table

vtt(

c1 bit

notnull

,c2 

varchar(5

) not

null

,c3 

bitnot

null

,c4 

nvarchar(5

) null

,c5 

bitnull

,c6 

intnot

null

)這裡將變長列篩選出來後就變成了c1、c3、c5、c6,有3個bit型別列是連續的,所以c1、c3、c5將公用乙個位元組。接下來就來驗證一下:

(1)插入一條示例資料:insert into vtt values(1,'abc',1,n'xyz',0,1023)

(2)用前面用的sql語句,同樣的方法,找出vtt表的第一頁為:0xc00000000100,對應的就是檔案號1,頁號192

(3)檢視該頁的內部資料:

00000000:   30000900 03ff0300 00060000 02001500 †0.    .............        

00000010:   1b006162 63780079 007a00†††††††††††††..abcx.y.z. 

插入的資料從第5個位元組開始03ff…… 這兒03就是c1、c3、c5的資料,03轉換成二進位制就是00000011。c1列對應最低位1,c3對應倒數第二位1,c5對應倒數第三位0。接下來的ff就是c6的值1023。後面的就是列數、null點陣圖、變長列等,這裡是討論bit位占用空間的,所以就不講解後面這些了。

3.乙個表中有多個bit型別的列,其順序是否連續決定了bit位是否可以共享乙個位元組。sql server中按照列順序儲存,第一列和最後一列都是bit資料型別列,不可以共用乙個位元組。

也就是說下面的表t1和表t2占用的空間是不同的,t1資料占用了7位元組,t2資料占用了8位元組。

create

tablet1(

c1 int

primary

key,

c2 bit

notnull

,c3 

bitnot

null

,c4 

char(2

) not

null

)create

tablet2(

c1 int

primary

key,

c2 bit

notnull

,c4 

char(2

) not

null

,c3 

bitnot

null

)但是在下面的t3和t4表中,由於中間是變長資料型別,所以他們的bit列占用的資料空間是相同的。

create

tablet3(

c1 int

notnull

,c2 

bitnot

null

,c3 

varchar(2

) not

null

,c4 

bitnot

null

)create

tablet4(

c1 int

notnull

,c2 

bitnot

null

,c4 

bitnot

null

,c3 

varchar(2

) not

null

)

BIT型別在SQL Server中的儲存大小

對於一般的int char tinyint等資料型別,他們占用的儲存空間都是以byte位元組為單位的,但是bit型別由於只有0和1或者說 false和true,這種情況只需要乙個bit位就可以表示了,那麼在sql server中bit型別到底占用了多少空間?是不是由乙個bit位來儲存的?或者可能是使...

bit 資料型別

在計算機內部,有數以萬計的器件在控制電子的運動。這些器件隨時監測這電路中各處電壓的變化,並做出不同響應操作。這些器件不僅能檢測電壓的有無,還能測量出電壓的大小。但是這樣無疑會導致控制和檢測電路的過度複雜性。如果只是檢測電路中兩點之間是否有電壓,那麼電路的複雜性也會大大降低。而在計算機內部,正是採取後...

sql中bit資料型別

在 sql server 中,用來處理判斷flag的字段,使用bit型別。在使用過程中有幾點需要注意的 bit 與 sql server 的整型和數字資料相似的數字資料,但 bit 列只能儲存 0 和 1。在插入 修改 bit 資料時,使用 0 或 1 而不是 false 或 true,bit 字段...