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

2021-08-29 15:43:36 字數 3371 閱讀 6651

對於一般的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(

c1int

primary

key,

c2bit

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.partitionsp

inner

join

sys.system_internals_allocation_unitsa

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(

c1bit

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(

c1int

primary

key,

c2bit

notnull,c3

bitnot

null,c4

char(2

)not

null

)create

tablet2(

c1int

primary

key,

c2bit

notnull,c4

char(2

)not

null,c3

bitnot

null)

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

create

tablet3(

c1int

notnull,c2

bitnot

null,c3

varchar(2

)not

null,c4

bitnot

null

)create

tablet4(

c1int

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 字段...