当前位置: 首页 > 科技观察

SQLite3中的数据类型-动态数据类型

时间:2023-03-12 00:48:37 科技观察

1.SQLite中的数据类型大多数SQL数据库引擎(据我们所知,除了SQLite之外的所有SQL数据库引擎)都使用静态的严格类型。使用静态类型时,列的数据类型由其容器(存储值的特定列)决定。SQLite使用更通用的动态类型系统。在SQLite中,值的数据类型与值本身相关联,而不是它的容器。SQLite的动态类型系统向后兼容其他数据库引擎的更常见的静态类型系统,因为在静态类型数据库上工作的SQL语句在SQLite中的行为方式应该相同。然而,SQLite中的动态类型允许它做一些在传统严格类型的数据库中不可能做的事情。2.存储类和数据类型SQLite数据库中存储的(或由数据库引擎操作的)每个值都是以下存储类之一:NULL。该值为NULL值。整数。该值是一个有符号整数,存储为1、2、3、4、6或8个字节,具体取决于值的大小。真实的。该值是一个浮点值,存储为一个8字节的IEEE浮点数。文本。该值是一个文本字符串,使用数据库编码(UTF-8、UTF-16BE或UTF-16LE)存储。斑点。该值是一个数据块,可以以二进制形式存储任何数据。存储类比数据类型更通用。例如,INTEGER存储类包括6种不同长度的整数数据类型。这因磁盘而异。但是一旦INTEGER值从磁盘读取到内存中进行处理,它们就会被转换为最常见的数据类型(8字节有符号整数)。因此,在大多数情况下,“存储类”与“数据类型”是无法区分的,这两个术语可以互换使用。除了INTEGERPRIMARYKEY列之外,SQLite版本3数据库中的任何列都可以用来存储任何存储类的值。SQL语句中的所有值,无论是嵌入在SQL语句文本中的文字,还是绑定到预编译SQL语句的参数,都有一个隐式存储类。在下面描述的情况下,数据库引擎可以在查询执行期间在数字存储类(INTEGER和REAL)和TEXT之间转换值。(1)布尔数据类型SQLite没有单独的布尔存储类。相反,布尔值存储为整数0(假)和1(真)。(2)日期和时间数据类型SQLite没有为存储日期和/或时间保留的存储类。相比之下,SQLite的内置日期和时间函数能够将日期和时间存储为TEXT、REAL或INTEGER值:TEXT是ISO8601字符串(“YYYY-MM-DDHH:MM:SS.SSS”)。REAL作为儒略日数,根据公历,自4714年11月24日格林威治中午以来的天数。INTEGER作为Unix时间,自1970-01-0100:00:00UTC以来的秒数。应用程序可以选择以这些格式中的任何一种存储日期和时间,并使用内置的日期和时间函数在格式之间自由转换。3.TypeAffinity使用严格类型的SQL数据库引擎通常会尝试自动将值转换为合适的数据类型。考虑一下:CREATETABLEt1(aINT,bVARCHAR(10));INSERTINTOT1(a,b)VALUES('123',456);在执行插入之前,严格类型的数据库将字符串“123”转换为整数123,并将整数456转换为字符串“456”。为了最大化SQLite和其他数据库引擎之间的兼容性,上面的示例将像在其他SQL数据库引擎上一样在SQLite上工作,并且SQLite支持列上的“类型亲和性”概念。列的类型关联是存储在该列中的数据的推荐类型。这里的主要想法是建议使用类型,而不是必需的。任何列仍然可以存储任何类型的数据。根据选择,某些列更喜欢一种存储类而不是另一种。列的首选存储类称为“亲和性”。SQLite3数据库中的每一列都分配了以下类型之一:TEXTNUMERICINTEGERREALBLOB(历史记录:类型“BLOB”的亲和力过去称为“NULL”。但该术语很容易与“无亲和力”混淆,因此它被重命名。)具有TEXT亲和力的列使用存储类NULL、TEXT或BLOB存储所有数据。如果将数字数据插入到具有TEXT亲和性的列中,则在存储之前将其转换为文本形式。具有NUMERIC亲和力的列可能包含使用所有五个存储类的值。将文本数据插入NUMERIC列时,如果此类转换是无损且可逆的,则文本的存储类别将转换为INTEGER或REAL(按优先顺序)。对于TEXT和REAL存储类之间的转换,如果保留数字的前15个有效小数位,则SQLite认为转换是无损和可逆的。如果TEXT不能无损地转换为INTEGER或REAL,则使用TEXT存储类存储该值。不会尝试转换NULL或BLOB值。字符串可能看起来像带有小数点和/或指数符号的浮点文字,但只要该值可以表示为整数,NUMERICaffinity就会将其转换为整数。因此,字符串“3.0e+5”存储在具有NUMERICaffinity的列中,作为整数300000,而不是浮点值300000.0。具有INTEGER关联的列与具有NUMERIC关联的列的行为相同。INTEGER和NUMERICaffinity之间的区别仅在CAST表达式中很明显。具有REAL亲和力的列的行为类似于具有NUMERIC亲和力的列,只是它将整数值强制转换为浮点表示形式。(作为内部优化,将没有小数部分且存储在具有REAL亲和力的列中的小浮点值作为整数写入磁盘以占用更少的空间,并在该值时自动转换回浮点数read.Optimization在SQL级别完全不可见,只能通过检查数据库文件的原始位来检测。)具有关联BLOB的列不喜欢一个存储类而不是另一个存储类,并且不试图将数据从一个存储类强制用于另一个存储班级。