標籤:des style color io ar 使用 for sp 檔案
資料庫命名規範
sqlite3_open()API用到資料庫的檔案名稱,可以是相對當前工作目錄的相對路徑名,也可以是從系統根檔案樹開始的完整路徑名。任何被本地檔案系統接受的正規檔案名稱都是好的。
如果檔案名稱是C語言中的NULL指標(即,0),SQlite建立並開啟一個臨時檔案。如果檔案名稱是記憶體位址,SQLite建立一個記憶體資料庫。在這兩種情況中,當應用程式關閉資料庫時,資料庫都會被消滅,即資料庫不是持久的。SQLite隨機播放臨時檔案名稱(以sqlite_開頭,後跟16位字母數字隨機串)。檔案嘗試在以下目錄存放,(1) /var/tmp, (2) /usr/tmp, (3) /tmp, (4) 當前工作目錄。不管是什麼方式開啟的資料庫(檔案資料庫,臨時資料庫,記憶體資料庫),在SQLite內部都被命名為主要資料庫(main database)。
在內部,資料庫檔案名不是資料庫名。他們是相關但是不同的概念。用attach命令,可以把一個資料庫檔案以不同的資料庫別名關聯到一個資料庫連接上。可以通過這些別名訪問資料庫檔案。
當應用程式用sqlite3_open()開啟資料庫時,SQLite會為每一個串連維護一個單獨的臨時資料庫。臨時資料庫儲存臨時對象(表及其索引)。應用程式可以在其查詢中用這兩個名稱(main和temp),例select * from temp.table1返回在臨時資料庫中表1的所有行,而不是主要資料庫中的。臨時資料庫的catalog名是sqlite_temp_master。臨時對象只在相同的資料庫連接內才是可見的,在對相同資料庫的不同的串連是不可見的,即使是同一個線程,進程或是程式。SQlite把臨時資料庫儲存在一個與主要資料庫檔案不同的單獨的臨時檔案中。當應用程式關閉到主要資料庫的串連時,會刪除這個臨時檔案。
資料庫檔案系統
除了記憶體資料庫,SQLite儲存一整個資料庫(main或temp)在一個單獨的頁中。
頁:為了方便空間按管理,SQLite把資料庫(包括記憶體資料庫)劃分成固定大小的地區,稱為資料庫的頁(頁大小為2的冪次方,從512到32768,預設1024。上界是由在代碼中或在外部儲存中的2位元組的有符號整數確定的)。資料庫是由頁的數組(可擴大或縮小)組成的,數組的下標稱為是頁號,下標從1開始直到231 -1結束(上界由本地檔案系統的最大檔案長度確定)。第0頁被作為沒有此頁或不是個頁對待,總之是物理上不存在的頁。第1頁以及以後的頁都是依次從資料庫檔案位移量為0的位置開始排列。
一旦建立了資料庫檔案,SQLite採用預設的也大小,但是在建立第一個表之前,也可通過編譯命令改變頁大小。SQlite把頁大小作為中繼資料的一部分來儲存。將會用這個值代替預設的頁大小(編譯命令用來改變資料庫的行為特性)。
頁類型:有四種頁:葉子頁,內部頁,溢出葉,自由頁。自由頁是無效(當前未被使用),其他的都是活躍的頁。
B+樹內部頁有搜尋導航資訊,葉子頁儲存實際的資料(表中的行),如果一行資訊量太大不能放入一個頁中,則部分資料存入葉子頁中,剩餘的存在溢出頁中。
B樹有內部頁有搜尋資訊和資料。
檔案頭:SQLite可以把任何頁類型用於任何資料庫頁,除了第1頁,它總是B+樹的內部頁。在該頁0位移地址處儲存了100位元組的檔案頭記錄,檔案頭記錄描述了資料庫檔案的資料結構。SQLite在建立一個資料庫檔案時初始設定檔案頭。
Offset Size Description
0 16 Header string This is the 16 byte string: "SQLite format 3."
16 2 Page size in bytes
18 1 File format write version
19 1 File format read version
20 1 Bytes reserved at the end of each page
21 1 Max embedded payload fraction
22 1 Min embedded payload fraction
23 1 Min leaf payload fraction
24 4 File change counter
28 4 Reserved for future use
32 4 First freelist page
36 4 Number of freelist pages
40 60 15 4-byte meta values
SQLite資料庫檔案格式