在官方檔案檔案中,我閱讀了以下有關記錄結構的內容
記錄按順序包含標題和正文。標頭以單個 varint 開頭,該 varint 確定標頭中的總位元組數。varint 值是標頭的大小(以位元組為單位),包括大小 varint 本身。大小 varint 之后是一個或多個附加 varint,每列一個。這些額外的變數稱為“序列型別”數字,并確定每列的資料型別,...
為了更深入地了解這一點,我創建了一個新資料庫(SQLite 版本 3.22.0)并生成了下表
sqlite> CREATE TABLE IF NOT EXISTS table_1(id INT NOT NULL, name TEXT NOT NULL);
sqlite> INSERT INTO table_1 VALUES (1, "Hello World");
我用十六進制編輯器打開了資料庫檔案。我的資料記錄保存如下:
0E 01 03 09 23 48 65 6C 6C 6F 20 57 6F 72 6C 64
標頭以標頭大小開始。在這種情況下為 14 ( 0E )。在此之后“在 size varint 之后是一個或多個附加 varint,每列一個”。這很困惑。我有兩列:id 和 name。所以我期望對應的序列型別代碼有兩個變種(見鏈接):
- 1(1位元組整數存盤值1)
- 23(表示 11 位元組字串:(0x23 = 35 => (35-13) / 2 = 11))
我本來期望以下標題:
03 01 23
與正文或資料段:
01 48 65 6C 6C 6F 20 57 6F 72 6C 64
為什么與官方文獻有區別?附加值是什么意思,為什么將標頭的長度指定為14位元組?
uj5u.com熱心網友回復:
您正在查看的0E 01位元組開頭來自 b-tree 葉單元標頭(14 位元組的有效負載(記錄),rowid 1),而不是記錄本身。
記錄標題實際上是03 09 23. 三個位元組長,第一列值為 1(不占用正文中的空間),以及一個 11 位元組的字串。然后是記錄體中的字串資料。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/511652.html
標籤:sqlite
上一篇:使用HTML檔案顯示資料庫
