大多数sql数据库引擎(据我们所知,除了sqlite之外的所有sql数据库引擎)都使用严格的静态类型。对于静态类型,值的类型由其容器决定——存储该值的特定列。sqlite使用更通用的动态类型系统。在sqlit中,值的数据类型与值本身有关,而不是与其容器有关。Sqlite的动态类型系统向后兼容其他数据库引擎的常用静态类型系统,在某种意义上,在静态类型数据库上工作的sql语句在sqlite中应该以相同的方式工作。然而,sqlite中的动态类型允许它做传统严格类型数据库不能做的事情。1.0存储类型和数据类型存储在sqlite数据库中的每个值(或由数据库引擎操作的值)都具有以下存储类型之一:null。该值为空值。整数。该值是一个带符号的整数,根据值的大小存储在1、2、3、4、6或8个字节中。真实的。该值是一个浮点数,存储为一个8字节的ieee浮点数。文本。值是文本字符串,使用数据库编码(utf-8、utf-16be或utf-16le)存储。斑点。值是在输入时存储的数据块。请注意,存储类型比数据类型更通用。以整型存储类型为例,它包括6种不同的不等长整型,在磁盘上是不同的。但是每当将整数值从磁盘读入内存进行处理时,它们都会被转换为更通用的数据类型(8字节有符号整数)。所以总的来说,“存储类型”和“数据类型”没有区别,两个术语可以互换使用。SQLiteversion3数据库中的任何列,除了整数主键列,都可以用来存储任何存储类型的值。SQL语句中的任何值,无论是嵌入在SQL语句中的文字还是绑定到预编译SQL语句的参数,都具有隐含的存储类型。在下述情况下执行查询时,数据库引擎会在数字存储类型(整数和实数)和文本之间进行转换。1.1布尔类型SQLite没有单独的布尔存储类型,而是将布尔值存储为整数0(假)和1(真)。1.2日期和时间类型sqlite没有其他存储类型来存储日期和时间。sqlite的内置日期和时间函数可以将日期和时间存储为文本、实数或整数值:textiso8601string("yyyy-mm-ddhh:mm:ss.sss")。真正的儒略日数字,根据公历前,从公元前4714年11月24日中午开始的天数,格林威治标准时间。整数unix时间,自1970-01-0100:00:00utc以来的秒数。应用程序可以选择以这些格式中的任何一种存储日期和时间,并且可以使用内置的日期和时间函数在这些格式之间自由转换。2.0类型亲和性为了最大化sqlite和其他数据库引擎之间的兼容性,sqlite支持列的“类型亲和性”概念。列的类型亲和性指的是要存储在该列中的数据的推荐类型。这里的重要思想是类型是推荐的,而不是必需的。任何列仍然可以存储任何类型的数据。这只是让一些列有选择地喜欢某种存储类型。列的首选存储类型称为其“亲和性”。sqlite3数据库中的每一列都分配了以下类型亲和力之一:文本数字整数实数无具有文本亲和力的列使用存储类型null、文本或blob存储所有数据。如果将数字数据插入具有文本亲和性的列中,则在存储之前将数据转换为文本形式。具有数字亲和力的列可能包含使用所有五个存储类的值。将文本数据插入数字列时,如果转换是无损或可逆的,则将文本的存储类型转换为整数或实数(按优先顺序)。对于文本类型和真实类型之间的转换,如果保留前15位有效的小数位,则SQLite认为转换是无损和可逆的。如果文本不能无损地转换为整数或实数,则该值将存储为文本。不要尝试转换null或blob值。字符串可能看起来像带有小数点和/或指数的浮点文字,但只要该值可以用整数表示,数字亲和力就会将其转换为整数。因此,字符串“3.0e+5”作为整数300000而不是浮点值30000.0存储在数字关联列中。具有整数亲和力的列与具有数字亲和力的列的行为相同。只是在演员表上,他们的区别就很明显了。具有实亲和力的列与具有数字亲和力的列的行为相同,只是整数值被强制转换为浮点表示(作为内部优化,以节省空间,没有小数部分并存储在实小亲和列上的浮点值作为整数写入磁盘,并在读取时自动转换回浮点值。在SQL级别,这种优化是完全不可见的,只能通过检查检测到的原始位来实现).亲和力为none的列不能从一种存储类型转换为另一种存储类型,并且不要尝试对其进行强制转换。2.1列亲和性确定列的亲和性由其声明的类型确定,遵循以下顺序所示的规则:1.如果声明的类型包含字符串“int”,则为其分配整数亲和性;2。如果列的声明类型包含任何字符串“char”、“clob”或“text”,则该列具有文本亲和性。注意:varchar类型包含“char”,指定为textaffinity;3.如果列的声明类型包含“blob”或没有指定类型,则该列没有亲和力;4.如果列的声明类型包含Any"real","floa"or"doub"string,则该列具有realaffinity;5.否则,它将具有数字亲和力。注意:确定列关联规则的顺序很重要。声明类型为“charint”的列将匹配规则1和2,但规则1优先于所有具有整数关联的列。2.2关联名称示例下表显示了通过上一节中介绍的五个规则,有多少来自更传统的SQL实现的常用数据类型名称被转换为各种关联类型。此表仅显示了sqlite接受的数据类型名称的一小部分。注意:在类型名称之后,括号中的数字参数(例如:varchar(255))会被sqlite忽略-sqlite不会对字符串、blob或数字的长度施加任何限制(大的全局sqlite_max_length限制除外)。注意:由于“point”末尾的“int”,“浮点”声明类型将被赋予整数亲和力,而不是真正的亲和力。并且“字符串”声明类型具有数字亲和力,而不是文本亲和力。2.3列亲和行为示例下面的SQL演示了SQLite在向表中插入值时如何使用列亲和来实现类型转换:
