SQLite FAQ中文版

发布时间:2018-11-15  栏目:sqlite  评论:0 Comments

  1. 怎么创造于加字段?
  2. SQLite 支持什么数据类型?
  3. 何以能于 SQLite 数据库的整型字段中插入字符串?
  4. 胡 SQLite 认为表达式 ‘0’==’00’ 为真正?
  5. 为什么 SQLite 不允许在相同布置表里使用 ‘0’ 和 ‘0.0’
    作为少数独不等的实践的主键?
  6. 何以不能够在 Linux box 中读取在 SparcStation 中创造的 SQLite
    数据库?
    7.
    大抵个应用程序或者和一个应用程序的大半单例程能而且存取同一个数据库文件也?
  7. SQLite是线程安全的也?
  8. 哪列有一个 SQLite 数据库被的有的表/索引?
  9. SQLite数据库是否来曾知道的轻重缓急限制?
  10. 每当 SQLite 中 VARCHAR 的极致可怜长是稍微?
  11. SQLite 是否支持 BLOB 类型?
  12. 怎么样由一个已经是的 SQLite 数据表中添加/删除字段?
  13. 自我去了众多数目而数据库文件并没有减弱多少,是勿是 Bug?
  14. 是不是会以 SQLite 用于商业用途而毫无交版权费用?
  15. 自家争下带有单引号(‘)的字符串?
  16. SQLITE_SCHEMA 错误代表什么?
  17. 怎ROUND(9.95,1) 返回 9.9 而休是 10.0? 难道9.95
    不拖欠提高进发位么?
  1. 怎创建于加字段?
  2. SQLite
    支持什么数据类型?
  3. 为何能够朝 SQLite
    数据库的整型字段中插入入字符串?
  4. 怎么 SQLite 认为表达式 ‘0’==’00’
    为确实?
  5. 胡 SQLite 不同意在平张表里使用 ‘0’ 和 ‘0.0’
    作为少数单不同的施行的主键?
  6. 干什么未可知当 Linux box 中读取在 SparcStation 中创造的 SQLite
    数据库?
  7. 基本上单应用程序或者跟一个应用程序的差不多只例程能而存取同一个数据库文件为?
  8. SQLite是线程安全的呢?
  9. 争列有一个 SQLite
    数据库中之有所的表/索引?
  10. SQLite数据库是否发一度解之高低限制?
  11. 当 SQLite 中 VARCHAR
    的太酷长是聊?
  12. SQLite 是否支持 BLOB
    类型?
  13. 什么自一个已在的 SQLite
    数据表中添加/删除字段?
  14. 自身去了诸多多少可数据库文件并从未减弱多少,是不是
    Bug?
  15. 是不是能将 SQLite
    用于商业用途而毫不交版权费用?
  16. 自己怎么利用带有单引号(‘)的字符串?
  17. SQLITE_SCHEMA
    错误代表什么?
  18. 怎么ROUND(9.95,1) 返回 9.9 而未是 10.0? 难道9.95
    不欠提高进发位么?

(1) 如何创造于添字段?


简单的回应:一个宣称也 INTEGER PRIMARY KEY 的字段将活动增加。

(1) 如何创建于增字段?

此处是事无巨细的答案: 从 SQLite 的 2.3.4
版本开始,如果你拿一个表中的一个字段声明也 INTEGER PRIMARY
KEY,那么不论你何时为该表的欠字段插入一个 NULL 值,这个 NULL
值将自动为移为比表中该字段所有行的极端深价值大 1
的整数;如果表也空,那么用被换为 1。比如,假要你产生这样的平等布置数据表:

简而言之的回复:一个宣称也 INTEGER PRIMARY KEY 的字段将活动增加。

此处是事无巨细的答案: 从 SQLite 的 2.3.4
版本开始,如果你以一个表中的一个字段声明也 INTEGER PRIMARY
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。新键相对于表中之就产生键来说是绝无仅有的,
但它可能与前起表中删除的键值重叠。要尽得到在全体表中绝无仅有的键,在INTEGER
PRIMARY
KEY的声明前加要词AUTOINCREMENT.这样受选的键将总是比表中曾经在的最深键大1。若可能的
最大键已存在于表中,INSERT操作将失败并返回一个SQLITE_FULL错误码.

CREATE TABLE t1(
a INTEGER PRIMARY KEY,
b INTEGER
);


于马上张数表里,声明

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

INSERT INTO t1 valueS(NULL,123);

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

每当逻辑意义上价于:


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

(3) 为什么能通往 SQLite 数据库的整型字段中插入字符串?

一个初的API函数 sqlite3_last_insert_rowid()
返回最近之插入操作的整形键

即时是一个功力,不是一个
bug。你可以另外字段中放任何音讯,而无用无配段声明为什么类型。
你可往整型字段中插任意长度的字符串,或者为布尔字段中插浮点数,或者向字符字段中
插入日期。在 CREATE TABLE
命令中你指定为这个字段的数据类型不会见克插入这个字段的数额。
所有的字段可以插任意长度的字符串。但于 INTEGER PRIMARY KEY
字段例外。这种字段只能 存放一个64各之平头,否则会出错。

只是SQLite会默认你愿意使声明的字段类型。所以,比如你望于一个宣称也INTEGER的字段
中插入一个字符串,SQLite会试图以其变为一个平头。如果换成,那么整数将为插,否
则插入字符串,这种特征有时让誉为type or column
affinity .

在意是整型键始终比之前插入表中的末段一个键大1。新键相对于表中的曾发生键来说是绝无仅有的,
但它恐怕与前从表中删除的键值重叠。要尽得到在全部表中绝无仅有的键,在INTEGER
PRIMARY
KEY的扬言前加要词AUTOINCREMENT.这样受捎的键将总是比表中早就存在的极度深键大1。若可能的
最大键已是于表中,INSERT操作将破产并返一个SQLITE_FULL错误码.


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

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

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

于 2.7.0 之后,表达式不建。参见文档 datatypes in SQLite version
3

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


当即是一个成效,不是一个
bug。你可以以另外字段中放任何消息,而未用无配段声明为什么类型。
你得于整型字段中插任意长度的字符串,或者为布尔字段中插浮点数,或者向字符字段中
插入日期。在 CREATE TABLE
命令中而指定为此字段的数据类型不会见克插入这个字段的数额。
所有的字段可以插任意长度的字符串。但于 INTEGER PRIMARY KEY
字段例外。这种字段只能 存放一个64各之平头,否则会错。

(5) 为什么 SQLite 不容许在同样摆表里使用 ‘0’ 和 ‘0.0’
作为片个例外之施行的主键?

而SQLite会默认你想使声明的字段类型。所以,比如你期望于一个宣称也INTEGER的字段
中插入一个字符串,SQLite会试图用该转移为一个平头。如果换成,那么整数将被插入,否
则插入字符串,这种特点有时让称作type or column affinity.

乃的主键一定是数值类的,把品种变更呢 TEXT 就好了。

各级一行要发一个唯一的主键。作为一个数字型的字段,SQLite 认为
‘0’‘0.0’ 的价是一样的,
因为他们于数字上之比是相当的(看前面的问题)因此值未是绝无仅有的。

123456下一页阅读全文


您可能感兴趣之篇章:

  • Android开发之SQLite的动方法
  • SQLite中的B-Tree实现细节解析
  • sqlite中文乱码问题由分析以及缓解
  • SQLite3中的日期时函数使用小结
  • sqlite3
    top的询问与limit语法介绍
  • SQLite优化方法
  • Sqlite 常用函数 推荐
  • SQLite 错误码整理
  • sQlite常用语以及sQlite
    developer的运与登记

(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
下在同一时间内只能发出一个经过读数据库。在本子 2.7.0 中 这个问题经过以
windows 接口代码中实践一个用户距离几带队读写锁定策略解决了。)
但如果数据库文件在一个 NFS
文件系统中,控制并发读书之锁定机制得以见面错。因为 NFS 的fcntl()
文件锁定有时见面有题目。如果出多进程可能并发读数据库则为当避免把数据库文件在
NFS 文件系统中。 根据微软的文档,如果无运行 Share.exe 后台程序则 FAT
文件系统中之锁定或者未干活。对 Windows
非常有经历的口告知我网络文件的锁定有为数不少题材还要不可靠。如果是这样,在2单或上述
Windows 系统中共享一个 SQLite 数据库文件会招致不可预知的题目。

咱们解没有其余的嵌入式 SQL数据库引擎比SQLite支持更多的并发性。
SQLite允许多进程
同时打开和读取数据库。任何一个经过需要写副常,整个数据库将以当时等同过程中吃锁定。但这一般只是耗时
几毫秒。其他进程就需要等候接下来继续其他事情。其他嵌入式SQL数据库引擎往往只允许就进程看数据库。

然而,client/server型的数据库引擎 (如 PostgreSQL, MySQL, 以及 Oracle)
通常支持更胜似之并发度,
并支持多进程而写副同一个数据库。由于总有一个说了算可以的服务器协调数据库的拜会,这才确保了上述
特性的落实。如果你的使用得充分高之并发度,你当考虑动用client/server数据库。事实上,经验告诉
我们大部分运用所急需之连发度比他们的设计者们想象的而少得差不多。

当 SQLite 尝试操作一个为外一个过程锁定的文件时,缺省之行事是回去
SQLITE_BUSY。你可以就此 C代码更改这同样表现。 使用
sqlite3_busy_handler()
或sqlite3_busy_timeout()
API函数。

若个别独或又多进程又打开和一个数据库,其中一个过程创造了新的说明要索引,则其它进程或未可知立刻看见新的申。其它进程可能得关闭并重复接数据库。


(8) SQLite是线程安全之呢?

有时是的。为了线程安全,SQLite 必须在编译时把 THREADSAFE
预处理宏设为1。在少省之发行的都编译版本被 Windows 版的凡线程安全的,而
Linux 版的非是。如果要求线程安全,Linux 版的比方双重编译。

“线程安全”是乘二单或三只线程可以同时调用独立的例外的sqlite3_open()
返回的”sqlite3 “结构。而无是在多线程中并且利用和一个 sqlite3
结构指针。

一个sqlite3 结构只能当调用
sqlite3_open
创建它的杀进程遭到行使。你不克在一个线程中开拓一个数据库然后拿指针传递给其它一个线程使用。这是坐多数大多线程系统的克(或
Bugs?)例如RedHat9上。在这些发生题目的系及,一个
线程创建的fcntl()锁不克由另外一个线程删除或涂改。由于SQLite依赖fcntl()锁来拓展并发控制,当在线程间传递数据库连接时会见现出严重的问题。

可能在Linux下出道缓解fcntl()锁之题材,但那十分复杂并且对正确的测试将是极困难的。因此,SQLite目前不容许在线程间共享句柄。

在UNIX下,你不可知通过一个 fork() 系统调用把一个开拓的 SQLite
数据库放入子过程遭到,否则会拧。


(9) 如何列有一个 SQLite 数据库被的兼具的表/索引?

sqlite3 命令行程序中你可以为此命令 “.tables
来展示有的表或者用 “.schema
“来展示有的表明结构及目录。但令后不要跟 LIKE
语句,否则会限制表的显示。

每当 C/C++ 程序中 (或应用
Tcl/Ruby/Perl/Python绑定的下边本中)你可以经过访名也”SQLITE_MASTER
的表来实现。每个 SQLite 数据库来一个 SQLITE_MASTER
表,表内发生数据库的布局。SQLITE_MASTER表是这般的:

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
字段是开创表或索引的原始语句文本。对于电动创建的目录(一般是行使
PRIMARY KEY 或 UNIQUE 创建的),sql 字段为 NULL.

SQLITE_MASTER表是只有念之。你无可知针对该表使用 UPDATE, INSERT, 或
DELETE。该表自动由 CREATE TABLE, CREATE INDEX, DROP TABLE 和 DROP
INDEX 命令更新。

临时表及其索引不以 SQLITE_MASTER 表中要在 SQLITE_TEMP_MASTER
中出现。SQLITE_TEMP_MASTER 与 SQLITE_MASTER
表一样干活,但特对开创临时表的次第可见。要博得所在表包括临时表可以用如下命令:

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或重新多多少以一个数据库中,
考虑使用呢是要设计的商号版数据库吧。

一个数据库的论战行数限制是 264
-1,显然你见面在高达行数限制之前先行超过文件大小的界定。目前一行可以存放
230 bytes 数据。而基本的文件格式可以支持实施大小及大体
262 bytes.

想必还会见发生于表、索引的数量或表和目录中之许段往往的限量,但不曾人掌握是小。事实上,每当新数据库打开时,SQLite需要读取和
分析所有表和目录声明的初始SQL,所以,为了调用
sqlite3_open()
时获得最佳性能,最好减少声明的发明的数目。同样的,即使
对于表中配段往往没有限制,多于100单呢显得无比多矣。
只出说明开始的31独字段会拿走优化。你可以一个目录中放入任意多的字段但跨30配段的目将非用于优化查询。

申,索引,视图,触发器和字段名称可以任意长,但SQL 函数名 (由
sqlite3_create_function()
API创建的)不得超过255独字符。


(11) 在 SQLite 中 VARCHAR 的极度要命长是不怎么?

SQLite不强制VARCHAR的长短。你可以声明一个VARCHAR(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 语句不合法不可知实行时即便见面回到一个
SQLITE_SCHEMA 错误。当这似是而非产生时,该语句应当用
sqlite3_prepare()
API函数重新编译。在 SQLite 版本3挨,只有使
sqlite3_prepare()
/sqlite3_step()
/sqlite3_finalize()
API函数执行 SQL 才见面来此错误,而使用
sqlite3_exec() .
则非会见。这和版本2不同。

大部发生此荒唐的原委是当 SQL
预处理完时数据库已经变更了(可能是受别一个进程改变之)。还可能有如下原因:

  • 针对一个数据库进行DETACH
    操作
  • 对一个数据库进行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地图