非常教程

Sqlite参考手册

其他 | Miscellaneous

Custom Builds Of SQLite

1.0简介

对于大多数应用程序,建议SQLite的建议方法是使用合并代码文件sqlite3.c及其相应的头文件sqlite3.h。sqlite3.c代码文件应该可以在任何unix,Windows系统上编译和运行,而不需要任何更改或特殊的编译器选项。大多数应用程序可以简单地将sqlite3.c文件与组成应用程序的其他C代码文件一起包含,将它们一起编译,并且具有工作和良好配置的SQLite版本。

大多数应用程序在SQLite默认配置下工作良好,并且没有特殊的编译时配置。大多数开发人员应该能够完全忽略这个文档,只需从 合并中 毫不费力地构建SQLite ,而不需要采取任何特殊的行动。

然而,经过高度调优和专门化的应用程序可能需要或需要用一些更适合应用程序需求的替代实现来替换SQLite的一些内置系统接口。SQLite旨在在编译时轻松进行重新配置,以满足各个项目的特定需求。SQLite的编译时配置选项包括:

  • 用另一种实现替换内置互斥子系统。
  • 完全禁用所有在单线程应用程序中使用的互斥。
  • 重新配置内存分配子系统以使用来自标准库的malloc()实现以外的内存分配器。
  • 重新调整内存分配子系统,以便它根本不调用malloc(),而是使用在启动时分配给SQLite的固定大小内存缓冲区来满足所有内存请求。
  • 使用替代设计将接口替换为文件系统。换句话说,覆盖SQLite为了用完全不同的系统调用与磁盘进行通信所进行的所有系统调用。
  • 覆盖其他操作系统接口,例如调用以获取祖鲁语或当地时间。

一般来说,SQLite中有三个独立的子系统,可以在编译时修改或重写。互斥子系统用于序列化对线程间共享的SQLite资源的访问。内存分配子系统用于分配SQLite对象和数据库缓存所需的内存。最后,虚拟文件​​系统子系统用于在SQLite和底层操作系统,特别是文件系统之间提供一个可移植的接口。我们称这三个子系统为SQLite的“接口”子系统。

我们强调大多数应用程序都由SQLite接口子系统的内置默认实现提供良好的服务。鼓励开发人员尽可能使用默认的内置实现,并且无需任何特殊的编译时选项或参数即可构建SQLite。但是,一些高度专业化的应用程序可能会从替换或修改一个或多个内置SQLite接口子系统中受益。或者,如果在Unix(Linux或Mac OS X),Windows(Win32或WinCE)或OS / 2以外的操作系统上使用SQLite,则SQLite中内置的任何接口子系统都不会工作,而且应用程序需要以提供适合于目标平台的替代实现。

2.0配置或更换Mutex子系统

在多线程环境中,SQLite使用互斥锁来序列化对共享资源的访问。互斥子系统仅适用于从多个线程访问SQLite的应用程序。对于单线程应用程序或仅从单个线程调用SQLite的应用程序,通过使用以下选项重新编译,可以完全禁用互斥子系统:

-DSQLITE_THREADSAFE = 0

互斥体很便宜,但它们不是免费的,所以当互斥体完全禁用时性能会更好。由此产生的库足迹也会稍小一些。在编译时禁用这些互斥锁是对它有意义的应用程序的推荐优化。

将SQLite用作共享库时,应用程序可以使用sqlite3_threadsafe()API测试是否禁用互斥锁。在运行时与SQLite链接并从多个线程使用SQLite的应用程序应该检查此API,以确保它们不会意外链接到禁用了互斥锁的SQLite库的版本。当然,无论SQLite是否配置为线程安全,单线程应用程序都能正常工作,但在使用禁用互斥锁的SQLite版本时,它会快一点。

SQLite互斥锁也可以在运行时使用sqlite3_config()接口禁用。为了完全禁用所有的静音,应用程序可以调用:

sqlite3_config(SQLITE_CONFIG_SINGLETHREAD);

在运行时禁用互斥锁并不像在编译时禁用互斥锁一样有效,因为SQLite仍然必须对布尔变量进行测试,以查看互斥锁可能需要的每个点的启用还是禁用。但是在运行时禁用互斥锁仍然具有性能优势。

对于注意管理线程的多线程应用程序,SQLite支持另一种运行时配置,这种配置是不使用任何互斥锁和忽略所有内容的默认情况之间的一半。这个中间互斥对齐可以如下建立:

sqlite3_config(SQLITE_CONFIG_MULTITHREAD);
sqlite3_config(SQLITE_CONFIG_MEMSTATUS, 0);

这里有两个单独的配置更改,可以用于单独或单独使用。SQLITE_CONFIG_MULTITHREAD设置禁用序列化访问数据库连接对象和预准备语句对象的互斥锁。使用此设置,应用程序可以自由地从多个线程使用SQLite,但它必须确保没有两个线程同时访问同一个数据库连接或任何与相同数据库连接关联的预准备语句。两个线程可以同时使用SQLite,但它们必须使用单独的数据库连接。第二个SQLITE_CONFIG_MEMSTATUS设置将禁用SQLite中跟踪所有未完成内存分配请求总大小的机制。这省略了互斥每个对sqlite3_malloc()和sqlite3_free()的调用的需要,这节省了大量的互斥操作。但是禁用内存统计机制的结果是sqlite3_memory_used(),sqlite3_memory_highwater()和sqlite3_soft_heap_limit64()接口停止工作。

SQLite在Unix上使用pthreads来实现它的互斥体实现,SQLite需要递归互斥体。大多数现代pthread实现都支持递归互斥锁,但并非所有的都可以。对于不支持递归互斥锁的系统,建议应用程序仅以单线程模式运行。如果这是不可能的,SQLite提供了一个在pthread的标准“快速”互斥体之上构建的替代递归互斥体实现。只要pthread_equal()是原子且处理器具有一致的数据高速缓存,此替代实现应该可以正常工作。以下编译器命令行开关启用了备用递归互斥体实现:

-DSQLITE_HOMEGROWN_RECURSIVE_MUTEX=1

将SQLite移植到新的操作系统时,通常需要用内置的互斥体子系统的互斥体原语替代内置的互斥体子系统。这是通过使用以下选项编译SQLite来完成的:

-DSQLITE_MUTEX_APPDEF=1

当使用SQLITE_MUTEX_APPDEF = 1选项编译SQLite时,它完全省略了其互斥体原语函数的实现。但是SQLite库仍然会在必要时尝试调用这些函数,所以应用程序必须自己实现互斥体原语函数并将它们与SQLite链接在一起。

3.0配置或更换内存分配子系统

默认情况下,SQLite从标准库的malloc()/ free()实现中获取对象和缓存所需的内存。还有一些正在进行的实验性内存分配器,它们可以满足从应用程序启动时交给SQLite的单个固定内存缓冲区的所有内存请求。有关这些实验性内存分配器的更多信息将在本文档的未来版本中提供。

SQLite支持应用程序在运行时指定替代内存分配器的能力,方法是使用指向替代实现的例程的指针填充sqlite3_mem_methods对象的实例,然后使用sqlite3_config()接口注册新的替代实现。例如:

sqlite3_config(SQLITE_CONFIG_MALLOC, &my_malloc_implementation);

SQLite创建sqlite3_mem_methods对象的内容的副本,以便在sqlite3_config()调用返回后修改对象。

4.0添加新的虚拟文件系统

从版本3.5.0(2007-09-04)开始,SQLite支持称为虚拟文件系统或“VFS”的接口。这个对象有些误称,因为它实际上是整个底层操作系统的接口,而不仅仅是文件系统。

VFS接口的一个有趣功能是SQLite可以同时支持多个VFS。当连接首次使用sqlite3_open_v2()打开时,每个数据库连接都必须选择一个VFS供其使用。但是如果一个进程包含多个数据库连接,每个连接可以选择不同的VFS。可以使用sqlite3_vfs_register()接口在运行时添加VFSes。

Unix,Windows和OS / 2上SQLite的默认构建包括适用于目标平台的VFS。SQLite为其他操作系统构建的默认情况下不包含VFS,但应用程序可以在运行时注册一个或多个VFS。

5.0将SQLite移植到新的操作系统

为了将SQLite移植到新操作系统 - 默认不支持的操作系统 - 应用程序必须提供...

  • 一个工作互斥子系统(但只有在它是多线程的时候),
  • 一个工作内存分配子系统(假设它的标准库中没有malloc()),和
  • 一个可行的VFS实施。

所有这些都可以在单个辅助C代码文件中提供,然后与库存“sqlite3.c”代码文件链接,以生成适用于目标操作系统的可用SQLite版本。除了替代互斥和内存分配子系统以及新的VFS之外,辅助C代码文件还应包含以下两个例程的实现:

  • sqlite3_os_init()
  • sqlite3_os_end()

“sqlite3.c”代码文件包含适用于Unix,Windows和OS / 2的VFS和sqlite3_initialize()和sqlite3_shutdown()函数的默认实现。为了防止编译sqlite3.c时加载这些默认组件之一,需要添加以下编译时选项:

-DSQLITE_OS_OTHER=1

SQLite核心将尽早调用sqlite3_initialize()。辅助C代码文件可以包含一个sqlite3_initialize()实现,该实现注册一个适当的VFS,并且还可能初始化一个替代互斥体系统(如果需要互斥体)或执行任何所需的内存分配子体系初始化。SQLite核心永远不会调用sqlite3_shutdown(),但它是官方SQLite API的一部分,并且在使用-DSQLITE_OS_OTHER = 1进行编译时不另外提供,所以辅助C代码文件可能应该提供完整性。

 SQLite在公共领域。

其他 | Miscellaneous相关

1.35% Faster Than The Filesystem
2.8+3 Filenames
3.An Asynchronous I/O Module For SQLite
4.Appropriate Uses For SQLite
5.Architecture of SQLite
6.Atomic Commit In SQLite
7.Automatic Undo/Redo With SQLite
8.Benefits of SQLite As A File Format
9.Change in Default Page Size in SQLite Version 3.12.0
10.Clustered Indexes and the WITHOUT ROWID Optimization
11.Compile-time Options
12.Constraint Conflict Resolution in SQLite
13.Deterministic SQL Functions
14.Distinctive Features Of SQLite
15.EXPLAIN QUERY PLAN
16.Features Of SQLite
17.File Format Changes in SQLite
18.Full-Featured SQL
19.High Reliability
20.Hints for Debugging SQLite
21.How SQLite Is Tested
22.How To Compile SQLite
23.How To Download Canonical SQLite Source Code
24.Imposter Tables
25.In-Memory Databases
26.Indexes On Expressions
27.Internal Versus External BLOBs
28.Isolation In SQLite
29.Long Term Support
30.Maintaining Private Branches Of SQLite
31.Many Small Queries Are Efficient In SQLite
32.Measuring and Reducing CPU Usage in SQLite
33.Memory-Mapped I/O
34.NULL Handling in SQLite
35.Partial Indexes
36.Pointer Passing Interfaces
37.Powersafe Overwrite
38.Release History Of SQLite
39.Result and Error Codes
40.Row Values
41.Rowid Tables
42.Run-Time Loadable Extensions
43.SQL Features That SQLite Does Not Implement
44.sqldiff.exe: Database Difference Utility
45.SQLite As An Application File Format
46.SQLite Autoincrement
47.SQLite Backup API
48.SQLite Changes From Version 3.4.2 To 3.5.0
49.SQLite Changes From Version 3.5.9 To 3.6.0
50.SQLite Database Speed Comparison
51.SQLite File IO Specification
52.SQLite Frequently Asked Questions
53.SQLite In 5 Minutes Or Less
54.SQLite is a Self Contained System
55.SQLite Is Serverless
56.SQLite Is Transactional
57.SQLite Library Footprint
58.SQLite Shared-Cache Mode
59.SQLite Unlock-Notify API
60.SQLite Version 3 Overview
61.SQLite: Single File Database
62.Temporary Files Used By SQLite
63.TH3
64.The COMPLETION() Table-Valued Function
65.The CSV Virtual Table
66.The dbhash.exe Utility Program
67.The DBSTAT Virtual Table
68.The Error And Warning Log
69.The generate_series Table-Valued Function
70.The OS Backend (VFS) To SQLite
71.The Spellfix1 Virtual Table
72.The SQLite Amalgamation
73.The SQLite Bytecode Engine
74.The sqlite3_analyzer.exe Utility Program
75.The SQLITE_STMT Virtual Table
76.The UNION Virtual Table
77.The Virtual Database Engine of SQLite
78.Uniform Resource Identifiers
79.Using SQLite In Multi-Threaded Applications
80.Version Numbers in SQLite
81.What If OpenDocument Used SQLite?
82.Why Is SQLite Coded In C
83.Zero-Configuration
Sqlite

SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库管理系统来

主页 https://sqlite.org/
源码 https://www.sqlite.org/src/
发布版本 3.21.0

Sqlite目录

1.C界面 | C Interface
2.C Interface: Session Module
3.CLI
4.数据库文件表 | Database File Format
5.数据类 | Datatypes
6.动态内存分配 | Dynamic Memory Allocation
7.外键约束 | Foreign Key Constraints
8.全文索引 | Full-Text Search
9.损坏方式 | How To Corrupt
10.JSON
11.语言 | Language
12.局限性 | Limits
13.锁定和并发 | Locking and Concurrency
14.其他 | Miscellaneous
15.PRAGMA Statements
16.查询计划程序 | Query Planner
17.R*Tree Module
18.RBU Extension
19.语法图 | Syntax Diagrams
20.Tcl Interface
21.虚拟表机制 | Virtual Table Mechanism
22.预写日志 | Write-Ahead Logging
23.SQL 教程
24.SQL 简介
25.SQL 语法
26.SQL DELETE 语句
27.SQL UPDATE 语句
28.SQL NOT NULL 约束
29.SQL 约束
30.SQL CREATE TABLE 语句
31.SQL CREATE DATABASE 语句
32.SQL INSERT INTO SELECT 语句
33.SQL SELECT INTO 语句
34.SQL CREATE VIEW、REPLACE VIEW、 DROP VIEW 语句
35.SQL AUTO INCREMENT 字段
36.SQL ALTER TABLE 语句
37.SQL 撤销索引、表以及数据库
38.SQL CREATE INDEX 语句
39.SQL DEFAULT 约束
40.SQL CHECK 约束
41.SQL FOREIGN KEY 约束
42.SQL PRIMARY KEY 约束
43.SQL UNIQUE 约束
44.SQL 通用数据类型
45.SQL ISNULL()、NVL()、IFNULL() 和 COALESCE() 函数
46.SQL NULL 值 – IS NULL 和 IS NOT NULL
47.SQL Server 和 MySQL 中的 Date 函数
48.SQL MS Access、MySQL 和 SQL Server 数据类型
49.SQL 函数
50.SQL 总结
51.SQL 主机
52.SQL 快速参考
53.SQL ROUND() 函数
54.SQL Server GETDATE() 函数
55.MySQL DATE_FORMAT() 函数
56.MySQL DATEDIFF() 函数
57.MySQL DATE_SUB() 函数
58.MySQL DATE_ADD() 函数
59.MySQL EXTRACT() 函数
60.MySQL DATE() 函数
61.MySQL CURTIME() 函数
62.MySQL CURDATE() 函数
63.MySQL NOW() 函数
64.SQL Server CONVERT() 函数
65.SQL Server DATEDIFF() 函数
66.SQL Server DATEADD() 函数
67.SQL Server DATEPART() 函数
68.SQLite 命令
69.SQLite 安装
70.SQLite 简介
71.SQLite 运算符
72.SQLite Select 语句
73.SQLite 删除表
74.SQLite 创建表
75.SQLite Insert 语句
76.SQLite 分离数据库
77.SQLite 附加数据库
78.SQLite 创建数据库
79.SQLite 数据类型
80.SQLite 语法
81.SQLite Order By
82.SQLite Limit 子句
83.SQLite Glob 子句
84.SQLite Like 子句
85.SQLite Delete 语句
86.SQLite Update 语句
87.SQLite AND/OR 运算符
88.SQLite Where 子句
89.SQLite 表达式
90.SQLite Distinct 关键字
91.SQLite Having 子句
92.SQLite Group By
93.SQLite Join
94.SQLite 约束
95.SQLite PRAGMA
96.SQLite 事务
97.SQLite 视图
98.SQLite Truncate Table
99.SQLite Alter 命令
100.SQLite Indexed By