跳转到内容

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.ac.cn/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 (链接)
华夏公益教科书