英文原文:Limits In SQLite
本文定義了 SQLite 的限制,如何針對這些限制定制特定的應用程序。默認的限制設置通常是適當的,幾乎適合於每一個應用。有一些應用程序可能需要在這里或者那里增加一個設置,但是我們估計這非常罕見。更普遍的是,應用程序可能需要重新編譯SQLite以及更低的限制來避免過多的資源利用率,以及在高級SQL語句生成器上幫助阻止攻擊者注入惡意SQL語句時發生錯誤。 在使用 sqlite3_limit() 接口的 limit categories 上,為該接口定義一些限制,可以在運行時改變每個基礎的連接。應用程序設計的運行時限制多數據庫,一些僅供內部使用的限制可以影響或控制潛在的敵對外部代理。舉例來說,一個web瀏覽器應用程序可能使用一個內部的數據庫來追蹤歷史頁面瀏覽量,但是它有一個或很多分離的數據庫,它們被創建和控制是通過 javascript 應用,這些應用都是從互聯網上下載的。那么 sqlite3_limit() 接口是允許通過可信代碼來管理約束內置數據庫的,同時在數據庫創建或控制上有着嚴格的限制,它會拒絕不可信的外部代碼攻擊服務。
|
![]() 無若
|
1、string或者BLOB的最大長度 SQLite中string或者BLOB的最大字節數是由預處理器宏SQLITE_MAX_LENGTH定義的。這個宏的默認值是10億,你可以在編譯時使用像下面這樣的命令行參數來對這個默認值進行調整: -DSQLITE_MAX_LENGTH=123456789 在當前實現中僅支持將string或者BLOB長度上調到最大231-1 or 2147483647。並且這個時候一些內置的函數例如hex()將會調用失敗。在安全敏感的應用中最好不要嘗試增加string和BlOB的最大長度。實際上,如果可以的話,你可以將string和BLOB的最大長度在一定范圍內降低(幾百方字節)。 在SQLite的INSERT和SELECT處理時,數據庫中中的每一行的所有內容都被編碼成單個BLOB。所以SQLITE_MAX_LENGTH這個參數同樣也定義了一行的最大字節數。string或者BLOB的最大長度可以在運行時通過sqlite3_limit(db,SQLITE_LIMIT_LENGTH,size) 方法調低。 2、最大列數 SQLITE_MAX_COLUMN在編譯時用來設置一個上限:默認設置SQLITE_MAX_COLUMN的值是2000。你可以在編譯的時候將它調整到最大32767。另一方面,許多經驗豐富的數據庫設計者會認為一個設計良好的數據庫永遠都不會在表中需要超過100列。 在大多數應用中的列數是很小的,大約幾十個而已。在SQLite代碼生成器中使用的算法是O(N²),這個N就是列數。所以如果你重新定義SQLITE_MAX_COLUMN為一個巨大的數字,那么在生成SQL的時候使用這個大列數你就會發現sqlite3_prepare_v2() 運行的很慢。最大列數可以在運行時使用sqlite3_limit(db,SQLITE_LIMIT_COLUMN,size) 方法調低。
|
![]() 氣質舞王尼古拉斯趙四
|
|
![]() leoxu
|
|
![]() leoxu
|
|
![]() leoxu
|
從屬數據庫的最大數量 ATTACH 語句是一項SQLite擴展,它能讓兩個或者更多個數據庫與同一個數據庫連接聯合起來,操作起來就好像它們是一個數據庫。能夠被聯合的數據庫數量被限制到了 SQLITE_MAX_ATTACHED 這樣一個常量,其默認值為10。被聯合數據庫的最大數量不能超過125。 被聯合的數據庫的最大數量可以在運行時使用 sqlite3_limit(db,SQLITE_LIMIT_ATTACHED,size) 接口來減小。 一個數據庫文件中頁面的最大數量 SQLite 能夠限制數據庫文件的大小,以阻止數據庫文件變得太大而消耗過多的磁盤空間。SQLITE_MAX_PAGE_COUNT 參數,一般會被設置成 1073741823, 就是一個數據庫文件中頁面的最大數量。一次會造成數據庫文件增長超過這個值的插入新數據的操作將會返回 SQLITE_FULL。 SQLITE_MAX_PAGE_COUNT 最大的可能設置是 214748364。當最大頁面大小為 65536 時, 最大的SQLite數據庫大小就大概是140太字節。最大頁面總數PRAGMA 可以被用來在運行時提高或者降低這個限制。 表中數據行的最大數量 表中數據行的最大數量理論上可以到 264 (18446744073709551616 or about 1.8e+19)。這一限制是不可及的,因為數據庫會首先達到140太字節的大小限制。一個140太字節大小的數據庫可以容納超過將近 1e+13 行的數據,而要容納這么多行數據,只能在沒有指數數據存在,並且每一行只包含非常少量數據的時候。 |
![]() leoxu
|
最大數據庫大小
每個數據庫都包含一個或多個“頁”(page)。在某個單一數據庫中,每個頁的大小相同,但是不同的數據庫擁有不同的頁大小,大小介於512字節(含)和65536字節(含)之間。一個數據庫文件最多包括2147483646頁。每個頁最大65536字節,換算可得最大數據庫大小約為1.4e+14字節(140千萬兆字節或128太字節或140000百萬兆字節或128000吉字節)。由於開發人員沒有能滿足這個限制的硬件條件,所以沒有對這個上限進行測試。然而,測試表明當數據庫達到底層文件系統的最大文件大小(通常要比理論上的最大數據庫大小小很多)並且由於磁盤空間耗盡而無法擴展時,SQLite依然能正確並穩健地運行。 模式中表的最大數量 數據庫文件中的每個表和索引至少需要一個頁。這里的索引可以使用CREATE INDEX 語句顯式地創建,也可以通過UNIQUE和PRIMARY KEY約束隱式地創建。由於數據庫文件的頁的最大數量是2147483646(比20億還多),所以模式中表和索引的數量上限也是這個。 只要數據庫被打開,就會掃描和解析整個模式,並將模式的解析樹存儲在內存中。也就是說數據庫的啟動時間和初始內存使用率與模式大小成正比。 |
http://www.oschina.net/translate/limits-in-sqlite-new