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报表设计器设计一个报表模板时,遇到一个多级分类的难题:需要将某个部门所有销售及下属部门的销售金额汇总,因为下属级别的层次不确定,所以靠拼接子查询的方式显然是 ...
随机推荐
- HttpModule,HttpHandler,HttpHandlerFactory
HttpModule:Http模块,可以在页面处理前后.应用程序初始化.出错等时候加入自己的事件处理程序. HttpHandler:Http处理程序,处理页面请求 HttpHandlerFactory ...
- day-7
/* 倒数7天了 某一天 某一刻 某次呼吸 我们终将再分离 而我的 自传里 曾经有你 没有遗憾的诗句 诗句里 充满感激 (小仙女博客抄来的233) 是啊 就快要结束了 曲终人散 上午被错误数据卡了一小 ...
- 会话技术之Cookie 和 Session
为什么要使用会话技术 会话从字面上来说就是,就是两个人说话,也就是两个人交流,那么这里说的是计算机web端的交流,因为互联网是基于HTTP传输信息的,而http传输是无状态协议,缺少状态,意味着如果后 ...
- [XML] ResourceManager一个操作Resource的帮助类 (转载)
点击下载 ResourceManager.zip /// <summary> /// 类说明:Assistant /// 编 码 人:苏飞 /// 联系方式:361983679 /// 更 ...
- Oracle: Oracle行转列、列转行的Sql语句总结
例子原型: ' ; 运行结果如下: 一.多字段的拼接 将两个或者多个字段拼接成一个字段: ' ; 运行结果: 二.行转列 将某个字段的多行结果,拼接成一个字段,获取拼接的字符串[默认逗号隔开] ' ; ...
- ios专题 - 单例模式的实现
[原创]http://www.cnblogs.com/luoguoqiang1985 单例模式是什么? 一个类只有一个实例. ----------------------- 这样做有什么好处? 在我的 ...
- 各大浏览器内核(Rendering Engine)
记得刚开始写网页的时候,听童鞋们说各大浏览器的内核,也是懵懵懂懂的,知一不知其二,今天特地查一下: 内核只是一个通俗的说法,其英文名称为“Layout engine”,翻译过来就是“排版引擎”,也被称 ...
- async: false的应用.
目的: 手机webview中, js ajax请求, success后, 进行window.open 操作 问题: 在Android, IOS均不能执行window.open 解决办法: 设置ajax ...
- 【JAVA集合】HashMap源码分析(转载)
原文出处:http://www.cnblogs.com/chenpi/p/5280304.html 以下内容基于jdk1.7.0_79源码: 什么是HashMap 基于哈希表的一个Map接口实现,存储 ...
- javascript 学习笔记之面向对象编程(二):继承&多态
~~接上篇~~上一篇实现了类的实现以及类成员变量和方法的定义,下面我们来了解下面向对象中两个最重要的特性:继承和多态. 继承 js中同样可以实现类的继承这一面向对象特性,继承父类中的所有成员(变量和属 ...