【数据库】sqlite中的限制:数据库大小、表数、列数、行数、参数个数、连接数等

一、参考网址

SQLite中的限制(官网):https://sqlite.org/limits.html
运行时限制类别(官网):https://sqlite.org/c3ref/c_limit_attached.html#sqlitelimitcolumn

二、详解
1、查看、设置sqlite限制命令.limit
sqlite> .limit	// 显示或设置数据库限制信息:SQLITE_LIMIT
              length 1000000000	// 字符串或BLOB的最大长度10亿,一行的最大长度
          sql_length 1000000000	// sql语句最大长度
              column 2000	// 列数,可以在编译时才可以将最大列出改为32767
          expr_depth 1000	// 表达式树的最大深度,SQLite将表达式解析到树中进行处理。
     compound_select 500	// 复合SELECT语句中的最大术语数
             vdbe_op 25000	// 虚拟机程序中用于实现SQL语句的最大指令数
        function_arg 127	// 一个函数的最大参数个数
            attached 10		// ATTACH语句,附加数据库最大值为125
 like_pattern_length 50000	// LIKE模式匹配算法或GLOB模式的最大长度
     variable_number 250000	// 任何参数的索引号
       trigger_depth 1000	// 触发递归的最大深度
      worker_threads 0		// 可以启动的辅助工作线程的最大数量
2、SQLite中的限制汇总
1)字符串或BLOB的最大长度

注:BLOB是sqlite的一种类型,用于存储二进制。
限制SQLite中字符串、BLOB类型值、数据库一行的最大字节数,默认值为10亿,最大为2147483647;
在编译时,通过SQLITE_MAX_LENGTH来设置;

-DSQLITE_MAX_LENGTH = 123456789

在运行时,通过sqlite3_limit(db, SQLITE_LIMIT_LENGTH, size)来降低该值;

官方建议:最好将最大字符串长度和blob长度减小到几百万。
在SQLite的INSERT和SELECT处理的一部分期间,数据库中每一行的全部内容被编码为单个BLOB。因此,SQLITE_MAX_LENGTH参数还确定一行中的最大字节数。

2)最大列数

最大列数用于限制一下项的上限:

表中的列数
索引中的列数
视图中的列数
UPDATE语句的SET子句中的术语数
SELECT语句的结果集中的列数
GROUP BY或ORDER BY子句中的术语数
INSERT语句中的值数

默认值为2000,最大为32767;
在编译时,通过SQLITE_MAX_COLUMN来设置,
在运行时,通过sqlite3_limit(db, SQLITE_LIMIT_COLUMN,size)来降低最大列数。

3)SQL语句的最大长度

对SQL语句的最大字节数的限制,默认值为1000000,最大为SQLITE_MAX_LENGTH和1073741824中较小的一个。
在编译时,通过SQLITE_MAX_SQL_LENGTH来设置;
在运行时,通过sqlite3_limit(db, SQLITE_LIMIT_SQL_LENGTH, size)来降低该值。

4)联接中的最大表数

SQLite不支持包含超过64个表的联接。不可更改

5)表达式树的最大深度

限制SQL语句表达式的复杂程度;
编译时通过SQLITE_MAX_EXPR_DEPTH参数设置,默认是1000;
如果SQLITE_MAX_EXPR_DEPTH为正,可以在运行时通过sqlite3_limit(db,SQLITE_LIMIT_EXPR_DEPTH,size)来降低
如果SQLITE_MAX_EXPR_DEPTH为0,则不受限制,上面的接口无效。

6)函数的最大参数个数

限制函数的参数个数,默认值是100,最大为127;
在编译时,通过SQLITE_MAX_FUNCTION_ARG来设置最大值;
在运行时,通过sqlite3_limit(db,SQLITE_LIMIT_FUNCTION_ARG,size)来降低该值。

7)复合SELECT语句中的最大项数

复合SELECT语句是通过运算符UNION,UNION ALL,EXCEPT或INTERSECT连接的两个或多个SELECT语句。每个单独的SELECT语句称为“项”。
默认值为500;官方不建议再增大;
在编译时,通过SQLITE_MAX_COMPOUND_SELECT来设置最大值;
在运行时,通过 qlite3_limit(db,SQLITE_LIMIT_COMPOUND_SELECT,size)来降低该值。

8)LIKE或GLOB模式的最大长度

LIKE、GLOB运算符:模式匹配比较,类似正则表达式;
限制LIKE或GLOB模式的表达式的字符长度;默认值为50000,官方不建议再增大;
在编译时,通过SQLITE_MAX_LIKE_PATTERN_LENGTH来设置最大值;
在运行时,通过sqlite3_limit(db,SQLITE_LIMIT_LIKE_PATTERN_LENGTH,size)来降低该值。

9)单个SQL语句中的最大占位符个数

限制C或C++ SQL接口中使用的占位符的个数;默认为999,最大值10亿;
在编译时,通过SQLITE_MAX_VARIABLE_NUMBER来设置最大值;
在运行时,通过sqlite3_limit(db,SQLITE_LIMIT_VARIABLE_NUMBER,size)来降低该值。

10)触发递归的最大深度

SQLite 触发器(Trigger)是数据库的回调函数,它会在指定的数据库事件发生时自动执行/调用。
限制回调函数递归的深度。
默认值是1000.;
在编译时,通过SQLITE_MAX_TRIGGER_DEPTH来设置最大值;
在运行时,无法设置;

11)数据库关联的最大数

使用ATTACH可以将多个数据库关联到一起,这样在操作时,就像操作一个数据库。
限制关联数据库的个数,默认值10,最大125;
在编译时,通过SQLITE_MAX_ATTACHED来设置最大值;
在运行时,通过sqlite3_limit(db,SQLITE_LIMIT_ATTACHED,size)来降低该值。

12)数据库文件中的最大页数

防止单个数据库文件过大;数据库文件大小由页数和单个页大小决定;
默认值为1073741823,最大2147483646
在编译时,通过SQLITE_MAX_PAGE_COUNT来设置;
在运行时,通过PRAGMA schema.max_page_count来查询和设置该值;
在插入新数据时,页数将要超过该值,会返回SQLITE_FULL。
如果页数最大为2147483646,页大小为65536时,数据库大小约为140 TB。

13)表中的最大行数

表中的理论最大行数为2^ 64(18446744073709551616或大约1.8e+19)。由于将首先达到140 TB的最大数据库大小,因此无法达到此限制。一个140 TB的数据库最多可以容纳大约1e+13行。
无法改变该值。

14)数据库大小限制

页数最大为2147483646,页大小为65536时,数据库大小约为140 TB

15)表个数限制

保存每个表的描述信息需要一页,因此该表的数量不会超过页数。
初始化数据库时,需要扫描所有表的描述信息、并保存在内存中。因此数据库连接启动时间和初始内存使用量和表的数量成正比。

3、运行时限制类别
#define SQLITE_LIMIT_LENGTH                    0
#define SQLITE_LIMIT_SQL_LENGTH                1
#define SQLITE_LIMIT_COLUMN                    2
#define SQLITE_LIMIT_EXPR_DEPTH                3
#define SQLITE_LIMIT_COMPOUND_SELECT           4
#define SQLITE_LIMIT_VDBE_OP                   5
#define SQLITE_LIMIT_FUNCTION_ARG              6
#define SQLITE_LIMIT_ATTACHED                  7
#define SQLITE_LIMIT_LIKE_PATTERN_LENGTH       8
#define SQLITE_LIMIT_VARIABLE_NUMBER           9
#define SQLITE_LIMIT_TRIGGER_DEPTH            10
#define SQLITE_LIMIT_WORKER_THREADS           11

这些常量定义了各种性能限制,可以在运行时使用 sqlite3_limit 降低这些限制

int sqlite3_limit(sqlite3*, int id, int newVal);

id取值如下:
SQLITE_LIMIT_LENGTH:任何字符串或BLOB或表行的最大大小,以字节为单位。

SQLITE_LIMIT_SQL_LENGTH:SQL语句的最大长度,以字节为单位。

SQLITE_LIMIT_COLUMN:表定义或SELECT结果集中的最大列数,或索引或ORDER BY或GROUP BY子句中的最大列数。

SQLITE_LIMIT_EXPR_DEPTH:任何表达式上分析树的最大深度。

SQLITE_LIMIT_COMPOUND_SELECT:复合SELECT语句中的最大术语数。

SQLITE_LIMIT_VDBE_OP:虚拟机程序中用于实现SQL语句的最大指令数。如果sqlite3_prepare_v2()或等效方法试图在单个准备好的语句中为多个操作码分配空间,则将返回SQLITE_NOMEM错误。

SQLITE_LIMIT_FUNCTION_ARG:一个函数的最大参数个数。

SQLITE_LIMIT_ATTACHED:附加数据库的最大数量。

SQLITE_LIMIT_LIKE_PATTERN_LENGTH:LIKE或 GLOB运算符的pattern参数的最大长度。

SQLITE_LIMIT_VARIABLE_NUMBER:SQL语句中任何参数的最大索引号。

SQLITE_LIMIT_TRIGGER_DEPTH:触发器的最大递归深度。

SQLITE_LIMIT_WORKER_THREADS:一个准备好的语句可以启动的辅助工作线程的最大数量 。

  • 11
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在C语言使用sqlite3数据库时,我们可以通过注册回调函数来处理查询结果。以下是一个简单的例子: ```c #include <stdio.h> #include <stdlib.h> #include <sqlite3.h> static int callback(void *data, int argc, char **argv, char **azColName){ int i; printf("%s: ", (const char*)data); for(i=0; i<argc; i++){ printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL"); } printf("\n"); return 0; } int main(int argc, char* argv[]){ sqlite3 *db; char *zErrMsg = 0; int rc; const char* data = "Callback function called"; rc = sqlite3_open("test.db", &db); if(rc){ fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db)); sqlite3_close(db); return 1; } char *sql = "SELECT * FROM mytable"; rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg); if(rc != SQLITE_OK){ fprintf(stderr, "SQL error: %s\n", zErrMsg); sqlite3_free(zErrMsg); } sqlite3_close(db); return 0; } ``` 在这个例子,我们定义了一个名为`callback`的回调函数。当查询执行完毕时,sqlite3会调用该函数来处理查询结果。该函数的参数包括查询结果的行数列数、每列的名称和值等信息。在这个例子,我们只是简单地输出了这些信息。 在`main`函数,我们通过`sqlite3_open`打开数据库,并通过`sqlite3_exec`执行查询。在执行查询时,我们将之前定义的`callback`函数作为第三个参数传递给`sqlite3_exec`函数。我们还将一个字符串作为第四个参数传递给了`callback`函数,这个字符串会被输出到控制台上,以表明`callback`函数已经被调用。 需要注意的是,在`callback`函数不能直接访问数据库连接对象。如果需要进行数据库操作,必须在`callback`函数外部创建一个新的数据库连接对象。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

郭老二

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值