麒麟v10 上部署 TiDB v5.1.2 生产环境优化实践
1190
2023-04-18
详解SQLite中的数据类型
大多数 sql 数据库引擎 (据我们所知,除 sqlite 之外的所有 sql 数据库引擎)都使用严格的静态类型。使用静态类型,值的类型便由它的容器 -- 存储值的特定的列 -- 来决定。
sqlite 使用更通用的动态类型系统。在 sqlit 中,值的数据类型与值本身相关,而不是与它的容器。sqlite 的动态类型系统与其它数据库引擎的常用静态类型系统是向后兼容的,在这个意义上,工作在静态类型数据库上的 sql 语句应该以同样的方式工作在 sqlite 中。然而,sqlite 中的动态类型允许它做传统的严格类型的数据库所不能做的事。
1.0 存储类型与数据类型
存储在 sqlite 数据库中的每个值(或是由数据库引擎所操作的值)都有一个以下的存储类型:
null. 值是空值。 integer. 值是有符号整数,根据值的大小以1,2,3,4,6 或8字节存储。 real. 值是浮点数,以8字节 ieee 浮点数存储。 text. 值是文本字符串,使用数据库编码(utf-8, utf-16be 或 utf-16le)进行存储。 blob. 值是一个数据块,按它的输入原样存储。
注意,存储类型比数据类型更笼统。以 integer 存储类型为例,它包括6种不同的长度不等的整数类型,这在磁盘上是不同的。但是只要 integer 值从磁盘读取到内存进行处理,它们就被转换为更为一般的数据类型(8字节有符号整型)。因此在一般情况下,“存储类型” 与 “数据类型” 没什么差别,这两个术语可以互换使用。
sqlite 版本3数据库中的任何列,除了整型主键列,都可用于存储任何存储类型的值。
sql 语句中的任何值,无论它们是嵌入到 sql 语句中的字面量还是绑定到预编译 sql 语句中的参数,都有一个隐含的存储类型。在下述情况下,数据库引擎会在执行查询时在数值存储类型(integer 和 real)和 text 之间进行转换。
1.1 布尔类型
sqlite 并没有单独的布尔存储类型,而是将布尔值存储为整数 0 (false) 和 1 (true)。1.2 日期和时间类型
sqlite 没有另外的存储类型来存储日期和时间。sqlite 的内置的日期和时间函数能够将日期和时间存为 text、real 或 integer 值:
text iso8601 字符串 ("yyyy-mm-dd hh:mm:ss.sss")。 real 儒略日数 (julian day numbers),按照前公历,自格林威治时间公元前4714年11月24日中午以来的天数。 integer unix 时间,自 1970-01-01 00:00:00 utc 以来的秒数。
应用可以选择这些格式中的任一种存储日期和时间,并使用内置的日期和时间函数在这些格式间自由转换。
2.0 类型亲和性
为了最大限度地提高 sqlite 和其它数据库引擎之间的兼容性,sqlite 支持列的“类型亲和性”的概念。列的类型亲和性是指数据存储于该列的推荐类型。这里重要的思想是类型是推荐的,而不是必须的。任何列仍可以存储任何类型的数据。这只是让一些列有选择性地优先使用某种存储类型。一个列的首选存储类型被称为它的“亲和性”。
每个 sqlite 3 数据库中的列都归于以下的类型亲和性中的一种:
text numeric integer real none
一个具有 text 亲和性的列使用存储类型 null、 text 或 blob 存储所有数据。如果数值数据被插入到一个具有 text 亲和性的列,则数据在存储前被转换为文本形式。
数值亲和性的列可能包含了使用所有五个存储类的值。当插入文本数据到数值列时,该文本的存储类型被转换成整型或实数(按优先级排序)如果这种转换是无损或可逆的的话。对于文本与实数类型之间的转换,如果前15个重要十进制数字被保留的话,sqlite认为这种转换是无损并可逆的。如果文本不能无损地转换成整型或实数,那这个值将以文本类型存储。不要试图转换null或blob值。
一个字符串可能看上去像带有小数点和/或指数符的浮点文字,但只要这个值可以用一个整型表示,数值亲和性就会把它转换成一个整型。因此,字符串‘3.0e+5'以整型300000,而不是浮点值30000.0的形式存储在一个数值亲和性的列里。
一个使用整型亲和性的列与具有数值亲和性的列表现一致。只是在cast表达式里,它们之间的区别体现得明显。
除了强制将整型值转换成浮点表示外,一个具有实数亲和性的列与具有数值亲和性的列表现一致(作为一个内部的优化,为了少占用空间,无小数部分且存储在实数亲和性列上的小浮点值以整型形式写到磁盘,读出时自动转换回浮点值。在sql级别,这种优化是完全不可见的,并且只能通过检查数据库文件的原始比特检测到)。
一个具有none亲和性的列不能从一种存储类型转换成另一种,也不要试图强制对它进行转换。
2.1 列亲和性测定
5. 否则,它将具有数值亲和性。
2.2 亲和性名字实例
下表显示了有多少从更传统的sql实现的常用数据类型名,通过上一节介绍的五个规则被转换成各种亲和性类型。这张表只显示了sqlite可接受的一小部分数据类型名。注意:跟在类型名后,括号内数值参数(如:varchar(255))将被sqlite忽略 - sqlite不对字符串、blobs或数值的长度强加任何限制(除了大型全局sqlite_max_length限制)。
2.3 列亲和性行为实例
以下sql演示当有值插入到一张表时,sqlite如何使用列亲和性实现类型转换的:
?
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。