您好,登錄后才能下訂單哦!
表的數據行具有圖6-5 所示的一般結構 (只要數據以未壓縮的形式存儲)。此格式稱為 FixedVar 格式, 因為所有固定長度列的數據首先存儲, 后跟所有可變長度列的數據。表6-7 顯示了存儲在每個 FixedVar 行中的信息。
狀態位 A 包含指示行屬性的位圖。這些位具有以下含義:
Bit 0 表示特殊的版本控制信息。在 SQL server 2012 中, 這始終是0。
Bits 1到3作為3位值,
0 (000) 表示主記錄,
1 (001) 表示轉發的記錄,
2 (010) 表示轉發存根,
3 (011) 指示一個索引記錄,
4 (100) 指示一個 BLOB 片段或行溢出數據,
5 (101) 表示虛影索引記錄,
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 和可變長度列" 部分所討論的。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。