sqliteSQLite FAQ中文版

  1. 怎样创立自增字段?
  2. SQLite
    支持什么数据类型?
  3. 何以能向 SQLite
    数据库的整型字段中插入字符串?
  4. 缘何 SQLite 认为表明式 ‘0’==’00’
    为真?
  5. 为什么 SQLite 不允许在同等张表里使用 ‘0’ 和 ‘0.0’
    作为五个不等的行的主键?
  6. 干什么不可能在 Linux box 中读取在 SparcStation 中创立的 SQLite
    数据库?
  7. 四个应用程序可能同2个应用程序的八个例程能同时存取同三个数据库文件呢?
  8. SQLite是线程安全的吗?
  9. 怎么列出贰个 SQLite
    数据库中的全数的表/索引?
  10. SQLite数据库是还是不是有已知的大小限制?
  11. 在 SQLite 中 VA宝马X5CHA安德拉的最大尺寸是有个别?
  12. SQLite 是还是不是协助 BLOB
    类型?
  13. 什么从3个已存在的 SQLite
    数据表中添加/删除字段?
  14. 自笔者删除了很多数据只是数据库文件并没有减小,是或不是Bug?
  15. 是否能将 SQLite
    用于商业用途而毫不交版权费用?
  16. 本身什么接纳含有单引号(‘)的字符串?
  17. SQLITE_SCHEMA
    错误代表怎样?
  18. 怎么ROUND(9.95,1) 再次回到 9.9 而不是 10.0? 难道9.95
    不应该向上进位么?

(1) 怎么样创制自增字段?

简单的回答:1个声称为 INTEGE卡宴 P本田CR-VIMA昂CoraY KEY 的字段将电动扩展。

那边是事无巨细的答案: 从 SQLite 的 2.3.4
版本起始,假使您将1个表中的一个字段声明为 INTEGE途锐 PRubiconIMALANDY
KEY,那么不论你什么日期向该表的该字段插入二个 NULL 值,那些 NULL
值将自动被撤换为比表中该字段全数行的最大值大 1
的平头;假使表为空,那么将被更换为 1。比如,假设你有如此的一张数据表:

CREATE TABLE t1(

a INTEGER PRIMARY KEY,

b INTEGER

);

在那张数据表里,评释

INSERT INTO t1 VALUES(NULL,123);

在逻辑意义上等价于:

INSERT INTO t1 VALUES((SELECT max(a) FROM t1)+1,123);

二个新的API函数
sqlite3_last_insert_rowid()
重临最近的插入操作的整形键

小心这几个整型键始终比此前插入表中的最后一个键大1。新键相对于表中的已有键来说是绝无仅有的,
但它只怕与事先从表中删除的键值重叠。要一味获得在全路表中绝无仅有的键,在INTEGECR-VPHighlanderIMA奥迪Q7Y
KEY的表明从前加关键词AUTOINCREMENT.那样被选的键将总是比表中已存在的最大键大1。若大概的
最大键已存在于表中,INSE本田CR-VT操作将失败并回到一个SQLITE_FULL错误码.


(2) SQLite 支持什么数据类型?

参见 http://www.sqlite.org/datatype3.html .


(3) 为何能向 SQLite 数据库的整型字段中插入字符串?

这是二个职能,不是二个bug。你能够在此外字段中吐弃何音信,而不用管字段注脚为何类型。
你可未来整型字段中插入任意长度的字符串,可能往布尔字段中插入浮点数,也许往字符字段中
插入日期。在 CREATE TABLE
命令中您内定给这些字段的数据类型不会限制插入那些字段的多寡。
全体的字段能够插入任意长度的字符串。但对此 INTEGE翼虎 P大切诺基IMAWranglerY KEY
字段例外。那种字段只好 存放1个六九人的整数,否则会出错。

但SQLite会私下认可你指望选择注明的字段类型。所以,比如您愿意在三个声称为INTEGE科雷傲的字段
中插入1个字符串,SQLite会试图将其转移为二个平头。要是转换来功,那么整数将被插入,不然插入字符串,那种天性有时被称作type or column
affinity
.


(4) 为啥 SQLite 认为表达式 ‘0’==’00’ 为真?

在 2.7.0 之后,表明式不树立。参见文书档案 datatypes in SQLite version
3


(5) 为啥 SQLite 分歧目的在于同一张表里使用 ‘0’ 和 ‘0.0’
作为五个差别的行的主键?

你的主键一定是数值类型的,把品种改为 TEXT 就足以了。

每一行必须有一个唯一的主键。作为二个数字类型的字段,SQLite 认为
‘0’‘0.0’ 的值是一模一样的,
因为他们在数字上的可比是至极的(看眼下的标题)因而值不是唯一的。


(6) 为啥不可能在 Linux box 中读取在 SparcStation 中开创的 SQLite
数据库?

你要求升级你的 SQLite 库到 2.6.3 或更新版本。

x86 处理器是 little-endian 型的而 Sparc 是 big-endian 型的。新本子的
SQLite 消除了那几个题材。

注:   big endian和little
endian是CPU处理多字节数的不比方法。例如“汉”字的Unicode编码是6C49。那么写到文件里时,毕竟是将6C写在头里,依旧将49写在头里?若是将6C写在方今,正是big
endian。照旧将49写在眼下,正是little endian。


(7)
多少个应用程序也许同五个应用程序的八个例程能同时存取同二个数据库文件呢?

多进度可以而且打开同一个数据库,也能够同时 SELECT
。但唯有三个进程能够立即改数据库。

SQLite使用读/写锁定来控制数据库访问。(Win95/98/ME
操作系统缺乏读/写锁定协理,在低于 2.7.0 的版本中,那代表在 windows
下在同一时半刻间内只好有3个进程读数据库。在本子 2.7.0 中 那些题材经过在
windows 接口代码中履行2个用户距离可能率读写锁定策略化解了。)
但如若数据库文件在二个 NFS
文件系统中,控制并发读书的锁定机制可以会出错。因为 NFS 的fcntl()
文件锁定有时会出难点。假如有多进程恐怕并发读数据库则因当幸免把数据库文件放在
NFS 文件系统中。 依照微软的文档,要是不运维 Share.exe 后台程序则 FAT
文件系统中的锁定或然不办事。对 Windows
非常有经验的人告诉小编网络文件的锁定有许多标题同时离谱。若是是那样,在三个或上述
Windows 系统中国共产党享叁个 SQLite 数据库文件会促成不可预见的题材。

我们知道没有别的的嵌入式 SQL数据库引擎比SQLite帮助越来越多的并发性。
SQLite允许多种经营过
同时开辟和读取数据库。任何2个历程要求写入时,整个数据库将在这一进度中被锁定。但这相似仅耗时几纳秒。别的进度只需等候接下来继续别的业务。其余嵌入式SQL数据库引擎往往只同意单进度访问数据库。

不过,client/server型的数据库引擎 (如 PostgreSQL, MySQL, 以及 Oracle)
平时支持更高的并发度,
并匡助多进度同时写入同一个数据库。由于总有二个控制能够的服务器协调数据库的走访,那才保险了以上
性格的贯彻。假使您的选取须求很高的并发度,你应该考虑使用client/server数据库。事实上,经验告诉
大家大部分应用所急需的并发度比他们的设计者们想象的要少得多。

当 SQLite 尝试操作贰个被另一个历程锁定的公文时,缺省的行事是再次回到SQLITE_BUSY。你能够用 C代码更改这一表现。 使用
sqlite3_busy_handler()
sqlite3_busy_timeout()
API函数。

假使三个或越来越多进度同时开辟同2个数据库,个中二个进程缔造了新的表或索引,则别的进度可能否马上看见新的表。别的进度恐怕需求关闭等量齐观复连结数据库。


(8) SQLite是线程安全的吧?

有时是的。为了线程安全,SQLite 必须在编译时把 THREADSAFE
预处理宏设为1。在缺省的发行的已编译版本中 Windows 版的是线程安全的,而
Linux 版的不是。如若须求线程安全,Linux 版的要重新编写翻译。

“线程安全”是指1个或多个线程能够而且调用独立的分裂的sqlite3_open()
返回的”sqlite3 “结构。而不是在十二线程中并且利用同贰个 sqlite3
结构指针。

一个sqlite3 结构只万幸调用
sqlite3_open
创造它的可怜进度中动用。你不能够在贰个线程中打开三个数据库然后把指针传递给另三个线程使用。那是因为多数二十四线程系统的限制(或
Bugs?)例如RedHat9上。在那几个有标题标系统上,四个线程创造的fcntl()锁不能够由另3个线程删除或修改。由于SQLite依赖fcntl()锁来展开并发控制,当在线程间传递数据库连接时会出现严重的难题。

可能在Linux下有办法化解fcntl()锁的难题,但那11分复杂并且对林和平确的测试将是可是困难的。由此,SQLite最近不容许在线程间共享句柄。

在UNIX下,你无法经过二个 fork() 系统调用把三个开辟的 SQLite
数据库放入子进程中,不然会出错。


(9) 如何列出1个 SQLite 数据库中的全体的表/索引?

sqlite3 命令行程序中你能够用命令 “.tables
来展示全数的表大概用 “.schema
“来体现全体的表结构和目录。但命令后并非跟 LIKE
语句,不然会限制表的浮现。

在 C/C++ 程序中 (或选择Tcl/Ruby/Perl/Python绑定的脚本中)你能够因而访问名为”SQLITE_MASTER
的表来达成。各类 SQLite 数据库有一个 SQLITE_MASTE奥迪Q7表,表内有数据库的构造。SQLITE_MASTETucson表是那般的:

CREATE TABLE sqlite_master (

type TEXT,

name TEXT,

tbl_name TEXT,

rootpage INTEGER,

sql TEXT

);

对于表来说,type 字段的值为‘table’name
字段是表的名称。使用以下语句能够等到全体表的列表:

SELECT name FROM sqlite_master

WHERE type=’table’

ORDER BY name;

对此索引来说, type = ‘index’ , name 是索引的称谓,
tbl_name 是索引所属的表的名目。对于表和目录,sql
字段是创制表或索引的原始语句文本。对于活动创设的目录(一般是运用
PHighlanderIMA兰德MuranoY KEY 或 UNIQUE 创造的),sql 字段为 NULL.

SQLITE_MASTEXC90表是只读的。你不能对该表使用 UPDATE, INSEQashqaiT, 或
DELETE。该表自动由 CREATE TABLE, CREATE INDEX, DROP TABLE 和 DROP
INDEX 命令更新。

一时半刻表及其索引不在 SQLITE_MASTER 表中而在 SQLITE_TEMP_MASTER
中出现。SQLITE_TEMP_MASTER 与 SQLITE_MASTERAV4表一样工作,但只对于开创一时半刻表的次第可知。要赢得所在表包含一时半刻表能够利用如下命令:

SELECT name FROM 

(SELECT FROM sqlite_master UNION ALL

SELECT
FROM sqlite_temp_master)

WHERE type=’table’

ORDER BY name


(10) SQLite数据库是不是有已知的大小限制?

数据库大小被限定在 2TB(241 bytes).
那是辩论限制。事实上,你应该把
SQLite数据库的大小限制在100GB以下,以防出现运转品质上的难点。借使你须要仓库储存100GB或越多数据在1个数据库中,
考虑使用为此而规划的集团版数据库吧。

贰个数据库的申辩行数限制是 264
-1,鲜明你会在高达行数限制此前先超越文件大小的界定。方今一行能够存放
230 bytes 数据。而基本的文件格式能够支撑行大小到约
262 bytes.

或是还会有对于表、索引的多寡或表和目录中的字段数的范围,但没人知道是有点。事实上,每当新数据库打开时,SQLite须要读取和
分析全数表和目录注脚的先河SQL,所以,为了调用
sqlite3_open()
时得到最佳质量,最好缩短表明的表的数量。同样的,就算对于表中字段数没有限定,多于九二十一个也呈现太多了。
唯有表开头的三18个字段会博得优化。你能够在1个目录中放入任意多的字段但超过30字段的目录将不用于优化查询。

表,索引,视图,触发器和字段名称能够任意长,但SQL 函数名 (由
sqlite3_create_function()
API成立的)不得跨越256个字符。


(11) 在 SQLite 中 VA君越CHAQashqai 的最大尺寸是稍稍?

SQLite不强制VA中华VCHAPAJERO的尺寸。你能够声多美滋个VARCHA智跑(10),SQLite一样能够让你存放500个字符在内部。
并且它们会始终完整无缺——决不会被截断。


(12) SQLite 是还是不是援助 BLOB 类型?

SQLite 3.0 版帮衬在其余字段存放 BLOB 数据,不管字段注明为啥类型。


(13) 如何从三个已存在的 SQLite 数据表中添加/删除字段?

SQLite有一定量的ALTER
TABLE

协助,能够用于添加字段到表的末尾
或变更表名。假诺您要对表的构造作更复杂的修改,你供给再一次创设表。你能够在一个方今表中备份数据,撤消旧表,重建新表后再过来数据。

例如,假若你有二个名为 “t1” 的表,知名为 “a”, “b”, 和 “c”
八个字段,你要去除字段 “c” 。可按如下步骤操作:

BEGIN TRANSACTION;

CREATE TEMPORARY TABLE t1_backup(a,b);

INSERT INTO t1_backup SELECT a,b FROM t1;

DROP TABLE t1;

CREATE TABLE t1(a,b);

INSERT INTO t1 SELECT a,b FROM t1_backup;

DROP TABLE t1_backup;

COMMIT;


(14) 笔者删除了诸多数目只是数据库文件并从未减小,是否 Bug?

不是的。当你从 SQLite
删除数据之后,未利用的磁盘空间被添加到一个内在的“空闲列表”中用于存储你下次布署的数额。磁盘空间并没有丢失,不过也不向操作系统再次回到磁盘空间。

即使您剔除了大气的数量且想要减小数据库文件,执行
VACUUM 命令。VACUUM
命令会清空“空闲列表”,把数量库尺寸缩到微小。注意, VACUUM
会花费一些光阴(在 Linux
系统下差不多0.5秒/兆)并且要选用两倍于数据库文件大小的磁盘空间。

对此SQLite version 3.1, 替代VACUUM命令的贰个方法是auto-vacuum格局,用
auto_vacuum
pragma

语法开启该方式。


(15) 是还是不是能将 SQLite 用于商业用途而不用交版权开销?

可以。SQLite 是公开的
。代码的别的部分都并未注解全部权。你能够用它来做你想要的其它交事务情。


(16) 如何插入有单引号(’)的字符串?

利用双单引号即可,例如:

    INSERT INTO xyz VALUES('5 O''clock');

插入数据库的是:5 0’clock。


(17) SQLITE_SCHEMA 错误代表怎样?

在 SQLite 版本3中,当一个预处理 SQL 语句违法不可能执行时就会回去1个SQLITE_SCHEMA 错误。当以此错误发生时,该语句应当用
sqlite3_prepare()
API函数重新编写翻译。在 SQLite 版本3中,只有应用
sqlite3_prepare()
/sqlite3_step()
/sqlite3_finalize()
API函数执行 SQL 才会生出这几个错误,而接纳
sqlite3_exec() .
则不会。那与版本2区别。

绝大部分发生这么些错误的来由是当 SQL
预处理完时数据库已经转移了(可能是被另三个历程改变的)。还大概有如下原因:

  • 对2个数据库进行DETACH
    操作
  • 对3个数据库进行VACUUM
    操作
  • 贰个用户函数定义被去除或改动了。
  • 三个排序定义被删除或改变了。
  • 三个授权函数改变了。

消除的方法是双重编写翻译并再次尝试推行。全体关乎
sqlite3_prepare()
/sqlite3_step()
/sqlite3_finalize()
API 函数的都应该重新编写翻译。参见下例:

    int rc;

sqlite3_stmt *pStmt;

char zSql[] = “SELECT …..”;

do {

/ Compile the statement from SQL. Assume success. /

sqlite3_prepare(pDb, zSql, -1, &pStmt, 0);

while( SQLITE_ROW==sqlite3_step(pStmt) ){

/ Do something with the row of available data /

}

/ Finalize the statement. If an SQLITE_SCHEMA error has

occured, then the above call to sqlite3_step() will have

returned SQLITE_ERROR. sqlite3_finalize() will return

** SQLITE_SCHEMA. In this case the loop will execute again.

/

rc = sqlite3_finalize(pStmt);

} while( rc==SQLITE_SCHEMA );


(18) 为何ROUND(9.95,1) 重回 9.9 而不是 10.0? 难道9.95
不应该向上进位么?

SQLite 内部选拔二进制运算,9.95用 64-bit IEEE 浮点数 ( SQLite
内部使用的)
表示为9.949999999999999289457264239899814128875732421875。所以当你输入
“9.95”时,SQLite
就精晓为上述的数字,进而四舍五入得到9.9。那些标题在处理浮点二进制数总会时有爆发。平常的条条框框是十进制的有限浮点数平常不可能代表为二进制有限浮点数,只可以由最接近的二进制数来代表。那些看似数会相当类似原数,但总有个别细小的不等,所以或者不能赢得你预期的结果。

网站地图xml地图