目录

  • 一、参考网址
  • 二、详解
    • 1、查看、设置sqlite限制命令.limit
    • 2、SQLite中的限制汇总
      • 1)字符串或BLOB的最大长度
      • 2)最大列数
      • 3)SQL语句的最大长度
      • 4)联接中的最大表数
      • 5)表达式树的最大深度
      • 6)函数的最大参数个数
      • 7)复合SELECT语句中的最大项数
      • 8)LIKE或GLOB模式的最大长度
      • 9)单个SQL语句中的最大占位符个数
      • 10)触发递归的最大深度
      • 11)数据库关联的最大数
      • 12)数据库文件中的最大页数
      • 13)表中的最大行数
      • 14)数据库大小限制
      • 15)表个数限制
    • 3、运行时限制类别

一、参考网址

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

二、详解

1、查看、设置sqlite限制命令.limit
sqlite> .limit    // 显示或设置数据库限制信息:SQLITE_LIMITlength 1000000000    // 字符串或BLOB的最大长度10亿,一行的最大长度sql_length 1000000000 // sql语句最大长度column 2000 // 列数,可以在编译时才可以将最大列出改为32767expr_depth 1000   // 表达式树的最大深度,SQLite将表达式解析到树中进行处理。compound_select 500 // 复合SELECT语句中的最大术语数vdbe_op 25000   // 虚拟机程序中用于实现SQL语句的最大指令数function_arg 127    // 一个函数的最大参数个数attached 10       // ATTACH语句,附加数据库最大值为125like_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:一个准备好的语句可以启动的辅助工作线程的最大数量 。

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

  1. SQL Server中字段、记录、表、列、行、属性、元组、主键、外键的含义

    目录 零.码仙励志 一.字段 二.记录 三.表 四.字段.记录.表的关系 五.列 六.行 七.属性 八.元组 九.主键 十.外键 零.码仙励志 坚持和放弃,都不会绝对正确.最恨不过一句,逼不得已.最大 ...

  2. mysql中什么是表?列?行?什么是主键和外键?什么是索引?为什么要使用索引?

    mysql中什么是表?列?行? 在关系数据库中,表(Table)是数据的主要组织单元.它是由一组命名的列和行组成,用于存储和组织数据. 列(Column)是表中的一个字段,用于存储特定类型的数据.每个 ...

  3. matlab将x排序 y随之变化,在MATLAB中:XData和YData如何用更改的行数更新?

    我正在寻找一种方法来添加动态迁移数据的动态更新图(地点与时间)分隔连续几天的垂直分界线.部分挑战在于,这些分隔线的数量随着绘图域扩展以显示更多时间数据而发生变化:例如,随着绘图中天数从3增加到5,分隔 ...

  4. excel中使用countif函数,计算一列数据的重复内容个数

    excel中使用countif函数,计算一列数据的重复内容个数 平常,在统计数据时,需要知道excel表格中某一列数据的每个内容的具体个数有多少,虽然可以通过写代码解决,但是对于没有代码基础的人来说有 ...

  5. mysql是表级锁还是行级锁_带你了解MySQL数据库中的全局锁、表级锁、行级锁

    在 MySQL 数据库中,有很多各种各样的锁,这些锁大致可以分为三类:全局锁.表级锁.行级锁.这篇文章小编就带你简单了解一下这三种锁. 1. 全局锁 全局锁是粒度比较大的锁,基本上也使用不上,就像我们 ...

  6. sql向数据库表中插入列,sql给表的列添加说明,sql添加主外键约束,增加列,增加字段

    规则代码 use 数据库名--向表中插入列alter table 表名 add 列名 类型go--给表的列添加说明 execute sp_addextendedproperty 'MS_Descrip ...

  7. oracle服务怎么删除数据库,Oracle中手动删除数据库教程

    在很多情况下,或无法使用dbca工具的时候,我们需要手动来删除数据库.对此,可以借助drop database命令来实现,下面的描述中给出手动删除数据库. 的具体步骤,包含文件系统数据库以及ASM数据 ...

  8. pythonpandas数据库_python中使用pandas数据库

    python中使用pandas数据库 利用pandas进行数据分析,以及试用一下jupyter notebook import pandas as pd from pandas import Data ...

  9. Android 安卓数据库 sqlite android自带数据库使用

    Android 安卓数据库 Android是有自带的数据库的 原生数据库 public class MySQLiteHelper extends SQLiteOpenHelper {private s ...

  10. c 编程 mysql结果集_使用mysql C语言API编写程序—MYSQL数据库查询操作(执行查询操作,获取查询结果的字段数,记录行数,...

    //MYSQL_RES保存查询结构 MYSQL_RES* result_ = NULL; int error_code = 0; //保存错误码 char error_info[1024] = '\0 ...

最新文章

  1. 《中国式方案秘籍(下部)》
  2. AI一分钟 | 厉害了!BBC记者挑战中国天网工程,潜逃仅7分钟被抓;百度狂砸20亿,设国内最大规模的AI专项风投基金
  3. linux高可用集群(HA)原理详解
  4. 最全 | Redis可视化工具横向评测
  5. hbase 核心知识
  6. 如何数分钟创建并成功运行数千台云主机?
  7. Cocos2d-x特殊节点对象(瓦片地图、粒子系统、视差滚动)概述
  8. 小米路由r2d论坛_小米路由器R2D固件 V2.24.10 官方稳定版
  9. BorisFX Sapphire 2019 for AE Mac(蓝宝石插件) v2019.0.2激活版
  10. 清华大学迎来中国首个原创虚拟学生华智冰:智商、情商双高,颜值出众
  11. 计算机 word 节是什么,Word的分节符是什么
  12. 配电管理地理信息系统解决方案
  13. 多点触摸画板(MultiTouchCanvas)
  14. 揭秘HTTP/3优先级
  15. RISC-V SiFive U54内核——中断和异常详解
  16. Pomotroid 使用指南:一款高颜值 PC 端番茄时钟
  17. python情感分析语料库_利用Python实现中文情感极性分析
  18. 分享:基于软件定义的控制解决方案全文
  19. 基于STM32F767的RT-Thread移植学习
  20. 2009年国庆节+中秋节 放假啦

热门文章

  1. Leetcode 526.优美的排列 二进制状压DP
  2. OpenCV 错误:无法打开摄像头(打开摄像头卡机)
  3. Linux gcc 制作动/静态链接库
  4. 四、One-hot和损失函数的应用
  5. mysql 5.7 驱动_这些 MySQL 调优配置,你都知道吗?
  6. 兼容超大图片的处理_动态图适用性调研与兼容性方案
  7. 【力扣网练习题】合并两个有序链表
  8. 进一步封装axios并调用其读取数据(吐槽~在安卓9.0以下或者IOS10.X以下手机端H5页面不支持,在这两种情况下的系统只能使用ajax或者原生js请求后台数据)
  9. 在CentOS 7.5上升级SQLite3过程实录
  10. 1小时教你做360度全景“小星球”效果图 Skillshare – Create a Panoramic ‘Little Planet’ from Anywhere