表的數據行具備圖6-5 所示的通常結構 (只要數據以未壓縮的形式存儲)。此格式稱爲 FixedVar 格式, 由於全部固定長度列的數據首先存儲, 後跟全部可變長度列的數據。表6-7 顯示了存儲在每一個 FixedVar 行中的信息。數組
狀態位 A 包含指示行屬性的位圖。這些位具備如下含義:ide
Bit 0 表示特殊的版本控制信息。在 SQL server 2012 中, 這始終是0。版本控制
Bits 1到3做爲3位值, server
0 (000) 表示主記錄, blog
1 (001) 表示轉發的記錄, 索引
2 (010) 表示轉發存根, it
3 (011) 指示一個索引記錄, class
4 (100) 指示一個 BLOB 片斷或行溢出數據, 方法
5 (101) 表示虛影索引記錄, im
6 (110) 表示虛影數據記錄,
7 (111) 表示虛影版本記錄。
Bit 4 表示存在空位圖。在 SQL server 2012 中, 即便在任何列中都不容許有 null,
也始終存在空位圖。
Bit 5 表示行中存在可變長度列。
Bit 6 表示該行包含版本控制信息。
Bit 7 在 SQL server 2012 中不使用。
狀態位 B 字段中使用的惟一位表示該記錄是虛影轉發的記錄。
您能夠在圖6-5 和表6-7 中看到第三個和第四個字節指示行的固定長度部分的長度。如圖6-5 所示, 它的長度不包括2個字節的列數和空位圖, 這取決於表中列的總數, 這是可變長度。解釋這些位中數據的另外一種方法是, 在該行中能夠找到列數的位置。例如, 若是第三個和第四個字節 (字節 2–3) 包含值 0x0016 (即十進制 22), 則表示該行不只在列數的值以前有22個字節, 並且還意味着能夠在字節22中找到列數的值。
在每一個固定長度或可變長度數據塊中, 數據以建立表的列順序存儲。例如, 假設使用如下命令建立了一個表:
CREATE TABLE Test1
(
Col1 int NOT NULL,
Col2 char(25) NOT NULL,
Col3 varchar(60) NULL,
Col4 money NOT NULL,
Col5 varchar(20) NOT NULL
);
此行的固定長度數據部分包含 Col1 的數據, 後跟 Col2 的數據, 後跟 Col4 的數據。可變長度數據部分包含 Col3 的數據, 後跟 Col5 的數據。對於僅包含固定長度數據的行, 如下值爲 true。
數據行第一個字節的第一個十六進制數字爲 1, 表示不存在可變長度列。(第一個十六進制數字包括位4到 7; bits 6 和7老是 0, 若是不存在變長列, 則位5也是0。位4始終爲 1, 所以四位的值顯示爲1。
數據行結束於空位圖以後, 它遵循固定長度的數據 (即, 圖6-5 中顯示的陰影部分不會存在於只有固定長度數據的行中)。
每一個數據行的總長度是相同的。
具備任何可變長度列的數據行有一個列偏移量數組, 每一個非 NULL 可變長度列都有一個2字節的條目, 指示列在其中結束的行中的位置。(術語偏移和位置不是徹底可互換的。偏移量是基於0的, 而位置是基於1的。偏移量爲7的字節位於行中的第八字節位置。)存儲具備 NULL 值的可變長度列涉及一些特殊問題, 如後面的 "null 和可變長度列" 部分所討論的。