跳轉到內容

SQLite/簡介

來自華夏公益教科書
Clipboard

待辦事項
為了簡潔和連貫,重寫/調整文字。


與客戶端-伺服器資料庫管理系統不同,SQLite引擎沒有與應用程式通訊的獨立程序。相反,SQLite庫被連結進來,從而成為應用程式的組成部分。該庫也可以動態呼叫。應用程式透過簡單的函式呼叫來使用SQLite的功能,從而減少資料庫訪問延遲:單個程序內的函式呼叫比程序間通訊更有效。SQLite 將整個資料庫(定義、表、索引和資料本身)儲存為主機上的單個跨平臺檔案。它透過在寫入期間鎖定整個資料庫檔案來實現這種簡單的設計。SQLite 讀操作可以進行多工處理,但寫入只能按順序執行。

由於伺服器端設計,SQLite應用程式比客戶端-伺服器資料庫需要更少的配置。SQLite 被稱為零配置[1],因為它不需要服務管理(如啟動指令碼)或基於GRANT和密碼的訪問控制。訪問控制透過對資料庫檔案本身賦予的檔案系統許可權來處理。客戶端-伺服器系統中的資料庫使用檔案系統許可權,這些許可權僅允許守護程序訪問資料庫檔案。

伺服器端設計的另一個含義是,多個程序可能無法寫入資料庫檔案。在基於伺服器的資料庫中,多個寫入器將全部連線到同一個守護程序,該守護程序能夠在其內部處理鎖。另一方面,SQLite 必須依賴檔案系統鎖。它對同時訪問資料庫的其他程序瞭解甚少。因此,對於寫入密集型部署,SQLite 不是首選。 [2] 然而,對於併發性較低的簡單查詢,SQLite 效能得益於避免了將資料傳遞給另一個程序的開銷。

SQLite 使用 PostgreSQL 作為參考平臺。“PostgreSQL 會怎麼做”用於理解 SQL 標準。 [3][4] 一個主要差異是,除了主鍵之外,SQLite 不執行型別檢查;值的型別是動態的,不受模式的嚴格約束(儘管模式會在儲存時觸發轉換,如果這種轉換是潛在可逆的)。SQLite 努力遵循 Postel's Rule。 [5]

D. Richard Hipp 於 2000 年春天為通用動力公司設計了 SQLite,當時他正在為美國海軍承包。 [6] Hipp 正在設計導彈驅逐艦上使用的軟體,該軟體最初使用 HP-UX 和 IBM Informix 資料庫後端。SQLite 最初是作為 Tcl 擴充套件。 [7]

SQLite 的設計目標是允許程式在不安裝資料庫管理系統或不需要資料庫管理員的情況下執行。Hipp 基於 PostgreSQL 6.5 的語法和語義。2000 年 8 月釋出了 SQLite 1.0 版本,其儲存基於 gdbm(GNU 資料庫管理器)。SQLite 2.0 用自定義 B 樹實現替換了 gdbm,添加了事務功能。SQLite 3.0 在美國線上的部分資助下,增加了國際化、顯式型別和其他重大改進。

2011 年,Hipp 宣佈了他的計劃,即為 SQLite 資料庫新增 NoSQL 介面(管理用 JSON 表達的文件)並開發UnQLite,一個嵌入式面向文件的資料庫。 [8]。UnQLite 作為獨立資料庫釋出。 [9]

SQLite 實現了大多數 SQL-92 標準,但它缺少一些特性。例如,它部分提供了觸發器,但它無法寫入檢視(然而它提供了可以提供此功能的 INSTEAD OF 觸發器)。雖然它提供了複雜的查詢,但它的 ALTER TABLE 函式仍然有限,因為它無法修改或刪除列。 [10]

SQLite 對 SQL 相容 DBMS 使用了一個不尋常的型別系統;它不像大多數 SQL 資料庫系統那樣為列分配型別,而是為各個值分配型別;用語言術語來說,它是動態型別的。此外,它在某些方面弱型別與 Perl 相同:可以將字串插入整數列(儘管 SQLite 會先嚐試將字串轉換為整數,如果該列的首選型別是整數)。這為列增加了靈活性,尤其是在繫結到動態型別的指令碼語言時。但是,該技術無法移植到其他 SQL 產品。一個常見的批評是,SQLite 的型別系統缺乏其他產品中靜態型別列提供的資料完整性機制。SQLite 網站描述了“嚴格親和性”模式,但此功能尚未新增。 [5] 但是,它可以使用約束來實現,例如CHECK(typeof(x)='integer')[6]

支援完整 Unicode 功能的 SQLite 是可選的。 [11]

多個計算機程序或執行緒可以同時訪問同一個資料庫。多個讀取訪問可以並行完成。只有在當前沒有其他訪問正在處理的情況下才能滿足寫入訪問。否則,寫入訪問將失敗並出現錯誤程式碼(或可以自動重試,直到配置的超時時間到期)。處理臨時表時,這種情況會發生變化。當開啟提前寫入日誌 (WAL) 時,此限制在 3.7 版中得到緩解,從而實現併發讀寫。 [12]

SQLite 3.7.4 版本首次添加了 FTS4(全文搜尋)模組,該模組在舊的 FTS3 模組上進行了改進。 [13] FTS4 允許使用者對文件執行全文搜尋,類似於搜尋引擎搜尋網頁的方式。 [14] 3.8.2 版本添加了對建立沒有 rowid 的表的支援,[15] 這可能會提高空間和效能。 [16] 公共表表達式支援在 SQLite 3.8.3 版本中新增。 [17]

2015 年,使用json1 擴充套件[18] 和新的子型別介面,SQLite 3.9 版本引入了 JSON 內容管理。

開發和分發

[編輯 | 編輯原始碼]

SQLite 的程式碼使用 Fossil 託管,Fossil 是一個分散式版本控制系統,本身建立在 SQLite 資料庫之上。 [19]

SQLite 的分發中提供了一個獨立的命令列程式。它可以用來建立資料庫、定義表、插入和更改行、執行查詢和管理 SQLite 資料庫檔案。它還可以作為編寫使用 SQLite 庫的應用程式的示例。

SQLite 在每次釋出之前都使用自動迴歸測試。作為釋出驗證的一部分,運行了超過 200 萬次測試。從 2009 年 8 月 10 日釋出的 SQLite 3.6.17 開始,SQLite 釋出版本具有 100% 的分支測試覆蓋率,這是程式碼覆蓋率的組成部分之一。測試和測試工具部分是公共領域的,部分是專有的。 [20]

知名使用者

[編輯 | 編輯原始碼]
  • 谷歌 Chrome、Opera、Safari 和 Android 瀏覽器都允許在瀏覽器中使用 Web SQL 資料庫技術,將資訊儲存在 SQLite 資料庫中並從資料庫中檢索資訊,儘管這種技術正在迅速過時(即將被 IndexedDB 取代)。
  • Mozilla Firefox 和 Mozilla Thunderbird 將各種配置資料(書籤、cookie、聯絡人等)儲存在內部管理的 SQLite 資料庫中。有一個第三方外掛使用支援此功能的程式碼,為管理任意 SQLite 資料庫提供使用者介面。[21]
  • 各種 Web 應用程式框架
  • Adobe Systems 在其 Adobe Photoshop Lightroom 中使用 SQLite 作為檔案格式,在 Adobe AIR 中使用 SQLite 作為標準資料庫,並在 Adobe Reader 內部使用 SQLite。[7]
  • Evernote 在 Windows 中使用 SQLite 儲存其本地資料庫儲存庫。
  • Skype[22]
  • 蘋果[23] 在 macOS 的 Core Data API 中將其作為一種選擇,從最初的 Mac OS X 10.4 實現開始,以及用於管理影片和歌曲,以及在 iOS 中用於儲存 iPhone 上的文字訊息。
  • Windows 10[24]

程式語言支援

[編輯 | 編輯原始碼]

大量的程式語言為 SQLite 提供了繫結,包括:

  • AutoIt[25]
  • 包括 FreeBASIC、PureBasic、RFO BASIC!、Visual Basic 和 Xojo 在內的各種 BASIC 方言
  • C
  • C#
  • C++
  • Clipper//Harbour
  • Curl
  • D
  • Elixir
  • Emacs Lisp[26]
  • F#[27]
  • Go
  • Haskell
  • Haxe
  • Java(在 JVM 和 DVM 上)
  • JavaScript[28]
  • Julia
  • 包括 Common Lisp、newLisp、OpenLisp 在內的 Lisp 發行版
  • Transcript(在 LiveCode 上)
  • LabVIEW
  • Lua
  • MATLAB
  • Nim
  • Objective-C(在 macOS 和 iOS 上)
  • OCaml
  • 包括 Free Pascal、Component Pascal 和 Delphi 在內的幾種 Pascal 風格
  • Perl[29]
  • PHP
  • Pike
  • Python[30]
  • R
  • Racket[31]
  • REBOL
  • Ruby[32]
  • Scheme
  • Smalltalk
  • Swift(在 macOS 和 iOS 上)
  • Tcl
  • Xojo

參考文獻

[編輯 | 編輯原始碼]
  1. "SQLite 是一個零配置資料庫". SQLite.org. 檢索於 2015 年 8 月 3 日.
  2. "SQLite 的適當用途". SQLite.org. 檢索於 2015-09-03.
  3. "PGCon 2014:叢集和 VODKA". Lwn.net. 檢索於 2017-01-06.
  4. "PGCon2014:SQLite:PostgreSQL 的門徒". Pgcon.org. 檢索於 2017-01-06.
  5. a b "SQLite:StrictMode". Sqlite.org. 檢索於 2015 年 9 月 3 日.
  6. a b Owens,Michael(2006)。SQLite 權威指南. Apress. doi:10.1007/978-1-4302-0172-4_1. ISBN 978-1-59059-673-9.
  7. a b "SQLite 的知名使用者". SQLite. 檢索於 2015 年 8 月 5 日.
  8. "訪談:Richard Hipp 談論 UnQL,一種面向文件資料庫的新查詢語言". InfoQ. 2011 年 8 月 4 日. 檢索於 2011 年 10 月 5 日.
  9. UnQLite 常見問題解答
  10. "SQLite 沒有實現的 SQL 功能". SQLite.org. 2009 年 1 月 1 日. 檢索於 2009 年 10 月 14 日.
  11. "Unicode 字元的區分大小寫匹配不起作用". SQLite 常見問題解答. 檢索於 2015-09-03.
  12. "SQLite 3.7 中的預寫日誌". SQLite.org. 檢索於 2011 年 9 月 3 日. WAL 提供了更高的併發性,因為讀取者不會阻塞寫入者,而寫入者也不會阻塞讀取者。讀取和寫入可以併發進行
  13. "SQLite 版本 3.7.4 於 2010 年 12 月 8 日釋出". SQLite.org. 2010 年 12 月 8 日. 檢索於 2015 年 9 月 3 日.
  14. "SQLite FTS3 和 FTS4 擴充套件". SQLite.org. 檢索於 2015 年 9 月 3 日.
  15. "SQLite 版本 3.8.2 於 2013 年 12 月 6 日釋出". SQLite.org. 2013 年 12 月 6 日. 檢索於 2015 年 9 月 3 日.
  16. "WITHOUT ROWID 最佳化". SQLite.org. 檢索於 2015 年 9 月 3 日.
  17. "SQLite 版本 3.8.3 於 2014 年 2 月 3 日釋出". SQLite.org. 2014 年 2 月 3 日. 檢索於 2015 年 9 月 3 日.
  18. https://sqlite.org/json1.html
  19. "Fossil: Fossil 效能". Fossil-scm.org. 2009 年 8 月 23 日. 檢索於 2009 年 9 月 12 日.
  20. "SQLite 如何測試". SQLite.org. 檢索於 2009 年 9 月 12 日.
  21. "SQLite 管理器 :: Firefox 的附加元件". Addons.mozilla.org. 2015-02-28. 檢索於 2017-01-06.
  22. "使用 SQLite 的 Skype 客戶端?". Mail-archive.com. 2007 年 8 月 28 日. 檢索於 2010 年 6 月 14 日.
  23. "顯示 Mac OS X 中所有下載檔案的下載歷史記錄列表". Osxdaily.com. 2012-07-12. 檢索於 2017-01-06.
  24. "SQLite 資料庫". Msdn.microsoft.com. 2016-09-19. 檢索於 2017-01-06.
  25. "使用者定義函式". Autoitscript.com. 檢索於 2017-01-06.
  26. "GNU Emacs 25+ 的 SQLite3 API". github.com. 檢索於 2017-10-02.
  27. Ross McKinlay; Colin Bull. "SQLProvider". Fsprojects.github.io. 檢索於 2017-01-06.
  28. "Google 程式碼存檔 - Google 程式碼專案託管的長期儲存". Code.google.com. 檢索於 2017-01-06.
  29. Adam Kennedy. "DBD::SQLite - 自包含的 RDBMS 在 DBI 驅動程式中". Metacpan.org. 檢索於 2017-01-06.
  30. "PySqlite – Trac 專案". Trac.edgewall.org. 2015-12-31. 檢索於 2017-01-06.
  31. "繼續:Racket 中的 Web 應用程式 - 15 使用 SQL 資料庫". docs.racket-lang.org. 檢索於 2017-02-24.
  32. "存檔副本". 存檔於 原文 於 2010-04-17. 檢索於 2010-04-03. {{cite web}}: 未知引數 |deadurl= 被忽略 (|url-status= 建議) (幫助)CS1 maint: archived copy as title (連結)
華夏公益教科書