SQLite FAQ


(12) SQLite 是不是支持 BLOB 类型?


在 2.7.0 之后,表达式不创造。参见文书档案 datatypes in SQLite version
3

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

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

对于SQLite version 3.1, 替代VACUUM命令的1个办法是auto-vacuum方式,用
auto_vacuum
pragma
语法开启该方式。



SQLite不强制VA哈弗CHA途乐的尺寸。你能够声澳优(Ausnutria Hyproca)个VA瑞鹰CHAKoleos(10),SQLite一样能够让你存放500个字符在里面。
并且它们会始终完整无缺——决不会被截断。

你需求升级你的 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。


(10) SQLite数据库是还是不是有已知的轻重缓急限制?



SQLite 内部采纳二进制运算,9.95用 64-bit IEEE 浮点数 ( SQLite
内部使用的)
表示为9.949999999999999289457264239899814128875732421875。所以当您输入
“9.95”时,SQLite
就知晓为上述的数字,进而四舍五入获得9.9。那些难题在处理浮点二进制数总会时有产生。日常的规则是十进制的少数浮点数平常不能够代表为二进制有限浮点数,只好由最相仿的二进制数来替代。这些近乎数会相当相近原数,但总某个一线的不等,所以或者无法获取你预期的结果。

ALTER TABLE Subscription ADD COLUMN Activation BLOB;
ALTER TABLE Subscription ADD COLUMN Key BLOB;

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

(2) SQLite 协理什么数据类型?

那是叁个意义,不是一个bug。你能够在任何字段中放弃何音信,而不用管字段表明为何类型。
你可以后整型字段中插入任意长度的字符串,大概往布尔字段中插入浮点数,大概往字符字段中
插入日期。在 CREATE TABLE
命令中您钦命给那个字段的数据类型不会限制插入那几个字段的数量。
全部的字段能够插入任意长度的字符串。但对于 INTEGE奥迪Q5 P翼虎IMAMuranoY KEY
字段例外。那种字段只好 存放一个陆玖人的平头,不然会出错。

但SQLite会默许你希望利用注明的字段类型。所以,比如您期望在一个宣称为INTEGEQashqai的字段
中插入贰个字符串,SQLite会试图将其更换为1个整数。借使转换到功,那么整数将被插入,不然插入字符串,那种性情有时被称作type or column
affinity
.

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

(11) 在 SQLite 中 VARCHA中华V 的最大尺寸是有点?

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

SQLite 3.0 版辅助在其余字段存放 BLOB 数据,不管字段表明为啥类型。


可以。SQLite
公开的。代码的别的部分都未曾证明全部权。你能够用它来做你想要的别样工作。

偶尔是的。为了线程安全,SQLite 必须在编写翻译时把 THREADSAFE
预处理宏设为1。在缺省的批发的已编写翻译版本中 Windows 版的是线程安全的,而
Linux 版的不是。就算必要线程安全,Linux 版的要重复编写翻译。

“线程安全”是指3个或多个线程能够而且调用独立的例外的sqlite3_open()
返回的”sqlite3“结构。而不是在三十二线程中而且选拔同3个 sqlite3
结构指针。

一个sqlite3结构只辛亏调用
sqlite3_open始建它的丰硕进度中采取。你无法在多个线程中开拓1个数据库然后把指针传递给另三个线程使用。那是因为大多数四线程系统的范围(或
Bugs?)例如RedHat9上。在那一个有题目标系统上,四个线程创造的fcntl()锁无法由另二个线程删除或涂改。由于SQLite依赖fcntl()锁来进展并发控制,当在线程间传递数据库连接时会出现严重的标题。

或许在Linux下有办法消除fcntl()锁的题材,但那10分复杂并且对周振天确的测试将是最最困难的。因而,SQLite近日分裂目的在于线程间共享句柄。

在UNIX下,你不能够经过2个 fork() 系统调用把一个开拓的 SQLite
数据库放入子进度中,不然会出错。

能够在1个作业中履行如下语句来提供 修改表的成效
将表名改为临时表
ALTER TABLE Subscription RENAME TO __temp__Subscription;
创立新表
CREATE TABLE Subscription (OrderId VARCHAR(32) PRIMARY KEY ,UserName
VARCHAR(32) NOT NULL ,ProductId VARCHAR(16) NOT NULL);
导入数据
INSERT INTO Subscription SELECT OrderId, “”, ProductId FROM
__temp__Subscription;
或者
INSERT INTO Subscription() SELECT OrderId, “”, ProductId FROM
__temp__Subscription;
留意 双引号”” 是用来填补原来不存在的数额的
除去权且表
DROP TABLE __temp__Subscription;

原稿链接:

(3) 为何能向 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;

您的主键一定是数值类型的,把项目改为 TEXT 就足以了。

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


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


(13) 怎么样从四个已存在的 SQLite 数据表中添加/删除字段?



并且只可以在表的末尾添加栏目

————————–修改表结构————————————————–
SQLite的的ALTE帕杰罗TABLE命令允许用户重命名或添加新的字段到已有表中,无法从表中删除字段。



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

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

(17) SQLITE_SCHEMA 错误代表怎样?

(5) 为啥 SQLite 不允许在平等张表里使用 ‘0’ 和 ‘0.0’
作为几个例外的行的主键?

在 SQLite 版本3中,当二个预处理 SQL 语句违规不能够实施时就会回到1个SQLITE_SCHEMA 错误。当这一个错误发生时,该语句应当用
sqlite3_prepare()
API函数重新编写翻译。在 SQLite 版本3中,唯有应用
sqlite3_prepare()/sqlite3_step()/sqlite3_finalize()
API函数执行 SQL 才会发生这些错误,而利用
sqlite3_exec().
则不会。那与版本2区别。

大部分发出那么些错误的由来是当 SQL
预处理完时数据库已经济体改成了(或许是被另叁个进度改变的)。还大概有如下原因:

  • 对贰个数据库进行DETACH操作
  • 对二个数据库实行VACUUM操作
  • 一个用户函数定义被删去或转移了。
  • 3个排序定义被剔除或变更了。
  • 3个授权函数改变了。

涸泽而渔的法子是重复编写翻译相提并论新尝试进行。全部涉嫌
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 );      

采取双单引号即可,例如:

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

安顿数据库的是:5 0’clock。

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

(6) 为何不能够在 Linux box 中读取在 SparcStation 中创建的 SQLite
数据库?

多过程能够同时打开同叁个数据库,也可以同时 SELECT
。但唯有2个进程可以即时改数据库。

SQLite使用读/写锁定来控制数据库访问。(Win95/98/ME
操作系统贫乏读/写锁定协理,在低于 2.7.0 的版本中,那意味着在 windows
下在同一时半刻间内只可以有3个经过读数据库。在本子 2.7.0 中 这几个题材经过在
windows 接口代码中实践一个用户距离可能率读写锁定策略化解了。)
但假设数据库文件在三个 NFS
文件系统中,控制并发读书的锁定机制能够会出错。因为 NFS 的fcntl()
文件锁定有时会出难点。如若有多进度恐怕并发读数据库则因当幸免把数据库文件放在
NFS 文件系统中。 根据微软的文书档案,固然不运维 Share.exe 后台程序则 FAT
文件系统中的锁定也许不坐班。对 Windows
格外有经验的人告诉笔者互联网文件的锁定有为数不少题目同时不可信。假使是那样,在叁个或上述
Windows 系统中国共产党享1个 SQLite 数据库文件会促成不可预感的题材。

大家理解没有此外的嵌入式 SQL数据库引擎比SQLite支持更多的并发性。
SQLite允许多种经营过
同时开辟和读取数据库。任何1个经过必要写入时,整个数据库将在这一进度中被锁定。但这一般仅耗费时间几微秒。别的进度只需等候接下来继续别的业务。其余嵌入式SQL数据库引擎往往只允许单进度访问数据库。

而是,client/server型的数据库引擎 (如 PostgreSQL, MySQL, 以及 Oracle)
常常帮助更高的并发度,
并帮助多进度同时写入同三个数据库。由于总有2个控制能够的服务器协调数据库的走访,那才保障了以上
本性的贯彻。借使您的选择必要很高的并发度,你应有考虑使用client/server数据库。事实上,经验告诉
大家大多数接纳所急需的并发度比她们的设计者们想象的要少得多。

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

即便多个或更多进程同时打开同3个数据库,当中叁个过程创建了新的表或索引,则其余进程可能还是不能够登时看见新的表。别的进度只怕供给关闭相提并论复连结数据库。

(7)
多少个应用程序大概同三个应用程序的几个例程能同时存取同一个数据库文件呢?


数据库大小被界定在 2TB(241 bytes).
那是辩论限制。事实上,你应当把
SQLite数据库的轻重限制在100GB以下,避防出现运维品质上的题材。若是您须求仓库储存100GB或越来越多多少在3个数据库中,
考虑动用为此而设计的店铺版数据库吧。

贰个数据库的说理行数限制是
264-1,分明你会在高达行数限制在此之前先当先文件大小的界定。方今一行能够存放
230 bytes 数据。而基本的文件格式能够协理行大小到约
262 bytes.

或然还会有对于表、索引的数据或表和目录中的字段数的范围,但没人知道是多少。事实上,每当新数据库打开时,SQLite需求读取和
分析全部表和目录注脚的伊始SQL,所以,为了调用
sqlite3_open()
时获得最好品质,最棒减弱证明的表的数目。同样的,固然对于表中字段数没有限制,多于玖拾柒个也显得太多了。
唯有表伊始的三十个字段会获得优化。你能够在八个索引中放入任意多的字段但超过30字段的目录将不用于优化查询。

表,索引,视图,触发器和字段名称能够任意长,但SQL 函数名 (由
sqlite3_create_function()
API创立的)不安妥先2伍拾一个字符。


(1) 怎么样成立自增字段?**

比如说,为 Subscription添加两个栏目

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

在 C/C++ 程序中 (或行使
Tcl/Ruby/Perl/Python绑定的脚本中)你能够通过走访名为”SQLITE_MASTER的表来完成。各个SQLite 数据库有2个 SQLITE_MASTELX570表,表内有数据库的组织。SQLITE_MASTE奥德赛表是那般的:

CREATE TABLE sqlite_master (  type TEXT,  name TEXT,  tbl_name TEXT,  rootpage INTEGER,  sql TEXT);

对此表来说,type字段的值为‘table’name
字段是表的称谓。使用以下语句可以等到全数表的列表:

SELECT name FROM sqlite_masterWHERE type='table'ORDER BY name;

对此索引来说, type = ‘index’, name 是索引的称号,
tbl_name 是索引所属的表的名称。对于表和目录,sql
字段是创办表或索引的原始语句文本。对于自动创制的目录(一般是行使
P福特ExplorerIMALacrosseY KEY 或 UNIQUE 创设的),sql字段为 NULL.

SQLITE_MASTE中华V表是只读的。你无法对该表使用 UPDATE, INSE中华VT, 或
DELETE。该表自动由 CREATE TABLE, CREATE INDEX, DROP TABLE 和 DROP
INDEX 命令更新。

临时表及其索引不在 SQLITE_MASTEPAJERO 表中而在 SQLITE_TEMP_MASTER
中出现。SQLITE_TEMP_MASTER 与 SQLITE_MASTE卡宴表一样工作,但只对于开创一时表的主次可知。要获取所在表包罗一时表能够利用如下命令:

SELECT name FROM    (SELECT * FROM sqlite_master UNION ALL    SELECT * FROM sqlite_temp_master)WHERE type='table'ORDER BY name

简单的回复:三个宣称为 INTEGEPRADO PPRADOIMA昂科雷Y KEY 的字段将电动扩充。

此地是事无巨细的答案: 从 SQLite 的 2.3.4
版本开始,倘若你将三个表中的二个字段证明为 INTEGE汉兰达 P劲客IMALANDY
KEY,那么不论是你何时向该表的该字段插入1个 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);

2个新的API函数
sqlite3_last_insert_rowid()
再次回到近期的插入操作的整形键

注意这么些整型键始终比在此以前插入表中的末梢2个键大1。新键相对于表中的已有键来说是唯一的,
但它恐怕与事先从表中删除的键值重叠。要一贯获得在全体表中唯一的键,在INTEGECR-VP奥迪Q5IMA大切诺基Y
KEY的扬言此前加关键词AUTOINCREMENT.那样被选的键将总是比表中已存在的最大键大1。若只怕的
最大键已存在于表中,INSE牧马人T操作将破产并赶回一个SQLITE_FULL错误码.

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

网站地图xml地图