SQLite 中的各种限制
英文原文:Limits In SQLite
|
本文定义了 SQLite 的限制,如何针对这些限制定制特定的应用程序。默认的限制设置通常是适当的,几乎适合于每一个应用。有一些应用程序可能需要在这里或者那里增加一个设置,但是我们估计这非常罕见。更普遍的是,应用程序可能需要重新编译SQLite以及更低的限制来避免过多的资源利用率,以及在高级SQL语句生成器上帮助阻止攻击者注入恶意SQL语句时发生错误。 在使用 sqlite3_limit() 接口的 limit categories 上,为该接口定义一些限制,可以在运行时改变每个基础的连接。应用程序设计的运行时限制多数据库,一些仅供内部使用的限制可以影响或控制潜在的敌对外部代理。举例来说,一个web浏览器应用程序可能使用一个内部的数据库来追踪历史页面浏览量,但是它有一个或很多分离的数据库,它们被创建和控制是通过 javascript 应用,这些应用都是从互联网上下载的。那么 sqlite3_limit() 接口是允许通过可信代码来管理约束内置数据库的,同时在数据库创建或控制上有着严格的限制,它会拒绝不可信的外部代码攻击服务。 |
无若
|
|
1、string或者BLOB的最大长度 SQLite中string或者BLOB的最大字节数是由预处理器宏SQLITE_MAX_LENGTH定义的。这个宏的默认值是10亿,你可以在编译时使用像下面这样的命令行参数来对这个默认值进行调整: -DSQLITE_MAX_LENGTH=123456789 在当前实现中仅支持将string或者BLOB长度上调到最大231-1 or 2147483647。并且这个时候一些内置的函数例如hex()将会调用失败。在安全敏感的应用中最好不要尝试增加string和BlOB的最大长度。实际上,如果可以的话,你可以将string和BLOB的最大长度在一定范围内降低(几百方字节)。 在SQLite的INSERT和SELECT处理时,数据库中中的每一行的所有内容都被编码成单个BLOB。所以SQLITE_MAX_LENGTH这个参数同样也定义了一行的最大字节数。string或者BLOB的最大长度可以在运行时通过sqlite3_limit(db,SQLITE_LIMIT_LENGTH,size) 方法调低。 2、最大列数 SQLITE_MAX_COLUMN在编译时用来设置一个上限:默认设置SQLITE_MAX_COLUMN的值是2000。你可以在编译的时候将它调整到最大32767。另一方面,许多经验丰富的数据库设计者会认为一个设计良好的数据库永远都不会在表中需要超过100列。 在大多数应用中的列数是很小的,大约几十个而已。在SQLite代码生成器中使用的算法是O(N²),这个N就是列数。所以如果你重新定义SQLITE_MAX_COLUMN为一个巨大的数字,那么在生成SQL的时候使用这个大列数你就会发现sqlite3_prepare_v2() 运行的很慢。最大列数可以在运行时使用sqlite3_limit(db,SQLITE_LIMIT_COLUMN,size) 方法调低。
|
气质舞王尼古拉斯赵四
|
|
leoxu
|
|
leoxu
|
|
leoxu
|
|
从属数据库的最大数量 ATTACH 语句是一项SQLite扩展,它能让两个或者更多个数据库与同一个数据库连接联合起来,操作起来就好像它们是一个数据库。能够被联合的数据库数量被限制到了 SQLITE_MAX_ATTACHED 这样一个常量,其默认值为10。被联合数据库的最大数量不能超过125。 被联合的数据库的最大数量可以在运行时使用 sqlite3_limit(db,SQLITE_LIMIT_ATTACHED,size) 接口来减小。 一个数据库文件中页面的最大数量 SQLite 能够限制数据库文件的大小,以阻止数据库文件变得太大而消耗过多的磁盘空间。SQLITE_MAX_PAGE_COUNT 参数,一般会被设置成 1073741823, 就是一个数据库文件中页面的最大数量。一次会造成数据库文件增长超过这个值的插入新数据的操作将会返回 SQLITE_FULL。 SQLITE_MAX_PAGE_COUNT 最大的可能设置是 214748364。当最大页面大小为 65536 时, 最大的SQLite数据库大小就大概是140太字节。最大页面总数PRAGMA 可以被用来在运行时提高或者降低这个限制。 表中数据行的最大数量 表中数据行的最大数量理论上可以到 264 (18446744073709551616 or about 1.8e+19)。这一限制是不可及的,因为数据库会首先达到140太字节的大小限制。一个140太字节大小的数据库可以容纳超过将近 1e+13 行的数据,而要容纳这么多行数据,只能在没有指数数据存在,并且每一行只包含非常少量数据的时候。 |
leoxu
|
|
最大数据库大小 每个数据库都包含一个或多个“页”(page)。在某个单一数据库中,每个页的大小相同,但是不同的数据库拥有不同的页大小,大小介于512字节(含)和65536字节(含)之间。一个数据库文件最多包括2147483646页。每个页最大65536字节,换算可得最大数据库大小约为1.4e+14字节(140千万兆字节或128太字节或140000百万兆字节或128000吉字节)。由于开发人员没有能满足这个限制的硬件条件,所以没有对这个上限进行测试。然而,测试表明当数据库达到底层文件系统的最大文件大小(通常要比理论上的最大数据库大小小很多)并且由于磁盘空间耗尽而无法扩展时,SQLite依然能正确并稳健地运行。 模式中表的最大数量 数据库文件中的每个表和索引至少需要一个页。这里的索引可以使用CREATE INDEX 语句显式地创建,也可以通过UNIQUE和PRIMARY KEY约束隐式地创建。由于数据库文件的页的最大数量是2147483646(比20亿还多),所以模式中表和索引的数量上限也是这个。 只要数据库被打开,就会扫描和解析整个模式,并将模式的解析树存储在内存中。也就是说数据库的启动时间和初始内存使用率与模式大小成正比。 |
http://www.oschina.net/translate/limits-in-sqlite-new
SQLite 中的各种限制的更多相关文章
- EF6 在 SQLite中使用备忘
== 菜鸟级选手试验在EF6中使用Sqlite,零EF基础,少量Sqlite基础.经过断断续续的很长时间 - _ -! >>连接 1. 安装 使用目前最新版本EF6.1,Sqlite1.0 ...
- sqlite中的replace、insert、update之前的区别
本文转自http://www.ithao123.cn/content-933827.html,在此感谢作者 android数据库操作,有两种方式,一种用android提供给我们的数据库操作函数inse ...
- (转)Sqlite中INTEGER PRIMARY KEY AUTOINCREMENT和rowid的使用
原文:http://www.cnblogs.com/peida/archive/2008/11/29/1343832.html Sqlite中INTEGER PRIMARY KEY AUTOINCRE ...
- SQLite中使用时的数据类型注意
在使用SQLite时,要注意:在SQLite中的Integer类型,对应在C#中需要使用long类型或者Int64 在使用SQLite时,要注意:在SQLite中存放的日期类型必须是如此:yyyy-M ...
- 谈数据库索引和Sqlite中索引的使用
要使用索引对数据库的数据操作进行优化,那必须明确几个问题:1.什么是索引2.索引的原理3.索引的优缺点4.什么时候需要使用索引,如何使用围绕这几个问题,来探究索引在数据库操作中所起到的作用. 1.数据 ...
- Android把图片保存到SQLite中
1.bitmap保存到SQLite 中 数据格式:Blob db.execSQL("Create table " + TABLE_NAME + "( _id INTEGE ...
- SQLite中不支持的sql语法
今天很自然的在写Sql语句的时候用了Top,一开始没发现问题,因为我从数据库读出的值正好是0,而我习惯变量定义的时候也都赋值0,可是到我不要0的时候我就发现问题了.后来才知道,可爱的小sqlite竟然 ...
- Android 保存图片到SQLite,读出SQLite中的图片
1.bitmap保存到SQLite 中 数据格式: db.execSQL("Create table express ( _id INTEGER PRIMARY KEY AUTOINCREM ...
- SQLite中使用CTE巧解多级分类的级联查询
在最近的项目中使用ActiveReports报表设计器设计一个报表模板时,遇到一个多级分类的难题:需要将某个部门所有销售及下属部门的销售金额汇总,因为下属级别的层次不确定,所以靠拼接子查询的方式显然是 ...
随机推荐
- Android(java)学习笔记169:Activity中的onCreate()方法分析
1.onCreate( )方法是android应用程序中最常见的方法之一: 翻译过来就是说,onCreate()函数是在activity初始化的时候调用的,通常情况下,我们需要在onCreate()中 ...
- Pivotal Cloud Foundry学习笔记(1)
PCF是一个PAAS平台 注册PCF账号 https://account.run.pivotal.io/sign-up 安装cf CLI 访问 https://console.run.pivotal. ...
- SQL删除重复行和查询所有大于某成绩的语句分析
有这样一个题,用一条SQL语句 查询出每门课都大于80分的学生姓名. 下面是表 分析,查询每门课程都大于80的学生.SELECT DISTINCT name FROM dbo.student WHER ...
- SqlSugar-执行Sql语句查询实例
使用SqlSugar执行sql语句 1.简单查询 SqlSugarClient db = SugarContext.GetInstance(); //执行sql语句,处理 //1.执行sql,转成li ...
- [Excel] C#GridViewExport帮助类,美化导出 (转载)
主要功能如下1.将整GridView的数据导出到Excel中关增加一个效果线做美化最新的GridViewExport操作类看下面代码吧 /// <summary> /// 类说明:Grid ...
- WIN7 VMware Ubuntu虚拟机连接secureCRT及ftp传输文件
一.安装vmware没有问题,网络设置以NAT方式(VMnet8是vmware专属的虚拟网卡).安装完毕后设置虚拟机的 VirtualNetworkEditor(可以再开始->所有程序VMwar ...
- c语言中函数的简单介绍
c语言中函数的介绍: 函数,简单的说就是代码的打包.存放在一个地方,当需要的时候调用. 函数分类: 1.无参无返回值函数 void func() 2.无参有返回值函数 int func() 3.有参 ...
- SQL反模式部分内容笔记
规范化: 1, 以一种我们能够理解的方式表达这个世界中的事物; 2, 减少数据冗余存储, 防止异常或者不一致的数据; 3, 支持完整性约束. Tips: 提高数据的性能不在此列表中. 意义: 规范化 ...
- C++学习笔记-2-构造函数和析构函数
问题2. 什么时候执行构造函数和析构函数 22:59:40 2015-07-22 做了一个实验: #include <iostream> class Object{ public: Ob ...
- Linux C++服务器程序设计范式
<Unix网络编程>30章详细介绍了几种服务器设计范式.总结了其中的几种,记录一下: 多进程的做法: 1.每次创建一个新的请求,fork一个子进程,处理该连接的数据传输. 2.预先派生一定 ...