SQLite3的动态数据类型,与众不同的数据库
liebian365 2024-11-19 06:27 17 浏览 0 评论
1.SQLite中的数据类型
大多数SQL数据库引擎(除了SQLite之外的每个SQL数据库引擎,据我们所知)都使用静态,严格的类型。使用静态类型时,列的数据类型由其容器(存储值的特定列)确定。
SQLite使用更通用的动态类型系统。在SQLite中,值的数据类型与值本身相关联,而不是与其容器相关联。SQLite的动态类型系统向后兼容其他数据库引擎的更常见的静态类型系统,因为在静态类型数据库上工作的SQL语句应该在SQLite中以相同的方式运行。但是,SQLite中的动态类型允许它执行传统的刚性类型数据库中无法实现的操作。
2.存储类和数据类型
存储在SQLite数据库中(或由数据库引擎操纵)的每个值都是以下存储类之一:
- NULL。该值为NULL值。
- INTEGER。该值是有符号整数,存储为1,2,3,4,6或8个字节,具体取决于值的大小。
- REAL。该值是浮点值,存储为8字节IEEE浮点数。
- TEXT。该值是一个文本字符串,使用数据库编码(UTF-8,UTF-16BE或UTF-16LE)存储。
- BLOB。该值是一个数据块,可以二进制的形式存储任何数据。
存储类比数据类型更通用。例如,INTEGER存储类包括6种不同长度的不同整数数据类型。这在磁盘上有所不同。但是一旦从磁盘读取INTEGER值并进入内存进行处理,它们就会转换为最通用的数据类型(8字节有符号整数)。因此,在大多数情况下,“存储类”与“数据类型”无法区分,并且这两个术语可以互换使用。
除了INTEGER PRIMARY KEY列之外,SQLite版本3数据库中的任何列都可用于存储任何存储类的值。
SQL语句中的所有值,无论是嵌入在SQL语句文本中的文字还是绑定到预编译SQL语句的参数, 都具有隐式存储类。在下面描述的情况下,数据库引擎可以在查询执行期间在数值存储类(INTEGER和REAL)和TEXT之间转换值。
2.1。布尔数据类型
SQLite没有单独的布尔存储类。相反,布尔值存储为整数0(假)和1(真)。
2.2。日期和时间数据类型
SQLite没有为存储日期和/或时间而预留的存储类。相反,SQLite 的内置日期和时间函数能够将日期和时间存储为TEXT,REAL或INTEGER值:
- TEXT为ISO8601字符串(“YYYY-MM-DD HH:MM:SS.SSS”)。
- REAL如朱利安日数,根据公历4714年11月24日格林威治中午以来的天数。
- INTEGER as Unix Time,自1970-01-01 00:00:00 UTC以来的秒数。
应用程序可以选择以任何这些格式存储日期和时间,并使用内置的日期和时间函数在格式之间自由转换 。
3.Type Affinity
使用严格类型的SQL数据库引擎通常会尝试自动将值转换为适当的数据类型。考虑一下:
CREATE TABLE t1(a INT, b VARCHAR(10)); INSERT INTO t1(a,b) VALUES('123',456);
在执行插入之前,刚性类型的数据库将字符串'123'转换为整数123,将整数456转换为字符串'456'。
为了最大化SQLite和其他数据库引擎之间的兼容性,上面的示例将像在其他SQL数据库引擎上一样对SQLite起作用,SQLite支持列上的“类型亲和性”概念。列的类型亲缘关系是存储在该列中的数据的推荐类型。这里的重要思想是建议使用类型,而不是必需的。任何列仍然可以存储任何类型的数据。根据选择,某些列更倾向于使用一个存储类而不是另一个存储类。列的首选存储类称为“亲和性”。
SQLite 3数据库中的每一列都分配了以下类型之一:
- 文本
- NUMERIC
- 整数
- 真实
- BLOB
(历史记录:“BLOB”类型的亲和力曾被称为“无”。但该术语容易与“无亲和力”混淆,因此它被重命名。)
具有TEXT亲缘关系的列使用存储类NULL,TEXT或BLOB存储所有数据。如果将数值数据插入到具有TEXT亲和力的列中,则在存储之前将其转换为文本形式。
具有NUMERIC亲缘关系的列可能包含使用所有五个存储类的值。当文本数据插入NUMERIC列时,如果此类转换是无损且可逆的,则文本的存储类将转换为INTEGER或REAL(按优先顺序)。对于TEXT和REAL存储类之间的转换,如果保留数字的前15个有效十进制数字,SQLite认为转换是无损且可逆的。如果无法将TEXT无损转换为INTEGER或REAL,则使用TEXT存储类存储该值。不尝试转换NULL或BLOB值。
字符串可能看起来像带有小数点和/或指数表示法的浮点字面值,但只要该值可以表示为整数,NUMERIC亲和关系就会将其转换为整数。因此,字符串'3.0e + 5'存储在具有NUMERIC亲和度作为整数300000的列中,而不是作为浮点值300000.0。
使用INTEGER关联的列与具有NUMERIC关联的列的行为相同。INTEGER和NUMERIC亲和力之间的区别仅在CAST表达式中很明显。
具有REAL亲和性的列的行为类似于具有NUMERIC亲和力的列,除了它将整数值强制为浮点表示形式。(作为内部优化,没有小数组件并存储在具有REAL关联性的列中的小浮点值将作为整数写入磁盘,以便占用更少的空间,并在读取值时自动转换回浮点。优化在SQL级别完全不可见,只能通过检查数据库文件的原始位来检测。)
具有关联性BLOB的列不优选一个存储类而不是另一个存储类,并且不会尝试将数据从一个存储类强制转换为另一个存储类。
相关推荐
- 4万多吨豪华游轮遇险 竟是因为这个原因……
-
(观察者网讯)4.7万吨豪华游轮搁浅,竟是因为油量太低?据观察者网此前报道,挪威游轮“维京天空”号上周六(23日)在挪威近海发生引擎故障搁浅。船上载有1300多人,其中28人受伤住院。经过数天的调...
- “菜鸟黑客”必用兵器之“渗透测试篇二”
-
"菜鸟黑客"必用兵器之"渗透测试篇二"上篇文章主要针对伙伴们对"渗透测试"应该如何学习?"渗透测试"的基本流程?本篇文章继续上次的分享,接着介绍一下黑客们常用的渗透测试工具有哪些?以及用实验环境让大家...
- 科幻春晚丨《震动羽翼说“Hello”》两万年星间飞行,探测器对地球的最终告白
-
作者|藤井太洋译者|祝力新【编者按】2021年科幻春晚的最后一篇小说,来自大家喜爱的日本科幻作家藤井太洋。小说将视角放在一颗太空探测器上,延续了他一贯的浪漫风格。...
- 麦子陪你做作业(二):KEGG通路数据库的正确打开姿势
-
作者:麦子KEGG是通路数据库中最庞大的,涵盖基因组网络信息,主要注释基因的功能和调控关系。当我们选到了合适的候选分子,单变量研究也已做完,接着研究机制的时便可使用到它。你需要了解你的分子目前已有哪些...
- 知存科技王绍迪:突破存储墙瓶颈,详解存算一体架构优势
-
智东西(公众号:zhidxcom)编辑|韦世玮智东西6月5日消息,近日,在落幕不久的GTIC2021嵌入式AI创新峰会上,知存科技CEO王绍迪博士以《存算一体AI芯片:AIoT设备的算力新选择》...
- 每日新闻播报(September 14)_每日新闻播报英文
-
AnOscarstatuestandscoveredwithplasticduringpreparationsleadinguptothe87thAcademyAward...
- 香港新巴城巴开放实时到站数据 供科技界研发使用
-
中新网3月22日电据香港《明报》报道,香港特区政府致力推动智慧城市,鼓励公私营机构开放数据,以便科技界研发使用。香港运输署21日与新巴及城巴(两巴)公司签署谅解备忘录,两巴将于2019年第3季度,开...
- 5款不容错过的APP: Red Bull Alert,Flipagram,WifiMapper
-
本周有不少非常出色的app推出,鸵鸟电台做了一个小合集。亮相本周榜单的有WifiMapper's安卓版的app,其中包含了RedBull的一款新型闹钟,还有一款可爱的怪物主题益智游戏。一起来看看我...
- Qt动画效果展示_qt显示图片
-
今天在这篇博文中,主要实践Qt动画,做一个实例来讲解Qt动画使用,其界面如下图所示(由于没有录制为gif动画图片,所以请各位下载查看效果):该程序使用应用程序单窗口,主窗口继承于QMainWindow...
- 如何从0到1设计实现一门自己的脚本语言
-
作者:dong...
- 三年级语文上册 仿写句子 需要的直接下载打印吧
-
描写秋天的好句好段1.秋天来了,山野变成了美丽的图画。苹果露出红红的脸庞,梨树挂起金黄的灯笼,高粱举起了燃烧的火把。大雁在天空一会儿写“人”字,一会儿写“一”字。2.花园里,菊花争奇斗艳,红的似火,粉...
- C++|那些一看就很简洁、优雅、经典的小代码段
-
目录0等概率随机洗牌:1大小写转换2字符串复制...
- 二年级上册语文必考句子仿写,家长打印,孩子照着练
-
二年级上册语文必考句子仿写,家长打印,孩子照着练。具体如下:...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- wireshark怎么抓包 (75)
- qt sleep (64)
- cs1.6指令代码大全 (55)
- factory-method (60)
- sqlite3_bind_blob (52)
- hibernate update (63)
- c++ base64 (70)
- nc 命令 (52)
- wm_close (51)
- epollin (51)
- sqlca.sqlcode (57)
- lua ipairs (60)
- tv_usec (64)
- 命令行进入文件夹 (53)
- postgresql array (57)
- statfs函数 (57)
- .project文件 (54)
- lua require (56)
- for_each (67)
- c#工厂模式 (57)
- wxsqlite3 (66)
- dmesg -c (58)
- fopen参数 (53)
- tar -zxvf -c (55)
- 速递查询 (52)