云服务器网:购买云服务器和VPS必上的网站!

SQLite教程:数据类型详解

一、存储种类和数据类型:SQLite将数据值的存储划分为以下几种存储类型:NULL: 表示该值为NULL值。INTEGER: 无符号整型值。REAL: 浮点值。TEXT: 文本字符串,存储使用的编码方式为UTF⑻、UTF⑴6BE、UTF⑴6LE。BLOB: 存

一、存储种类和数据类型:

SQLite将数据值的存储划分为以下几种存储类型:

NULL: 表示该值为NULL值。
INTEGER: 无符号整型值。
REAL: 浮点值。
TEXT: 文本字符串,存储使用的编码方式为UTF⑻、UTF⑴6BE、UTF⑴6LE。
BLOB: 存储Blob数据,该类型数据和输入数据完全相同。

由于SQLite采取的是动态数据类型,而其他传统的关系型数据库使用的是静态数据类型,即字段可以存储的数据类型是在表声明时即以肯定的,因此它们之间在数据存储方面或者存在着很大的差异。在SQLite中,存储分类和数据类型也有一定的差别,如INTEGER存储种别可以包括6种区别长度的Integer数据类型,但是这些INTEGER数据一旦被读入到内存后,SQLite会将其全部视为占用8个字节无符号整型。因此对SQLite而言,即便在表声明中明确了字段类型,我们依然可以在该字段中存储其它类型的数据。但是需要特别说明的是,虽然SQLite为我们提供了这类方便,但是一旦斟酌到数据库平台的可移植性问题,我们在实际的开发中或者应当尽量的保证数据类型的存储和声明的一致性。除非你有极其充分的理由,同时又不再斟酌数据库平台的移植问题,在此种情况下确切可使用SQLite提供的此种特点。

1. 布尔数据类型:

SQLite并没有提供专门的布尔存储类型,取而代之的是存储整型1表示true,0表示false。

2. 日期和时间数据类型:

和布尔类型一样,SQLite也一样没有提供专门的日期时间存储类型,而是以TEXT、REAL和INTEGER类型分别区别的格式表示该类型,如:

TEXT: “YYYY-MM-DD HH:MM:SS.SSS”
REAL: 以Julian日期格式存储
INTEGER: 以Unix时间情势保存数据值,即从1970-01-01 00:00:00到当前时间所流经的秒数。

二、类型亲缘性:

为了最大化SQLite和其它数据库引擎之间的数据类型兼容性,SQLite提出了”类型亲缘性(Type Affinity)”的概念。我们可以这样理解”类型亲缘性 “,在表字段被声明以后,SQLite都会根据该字段声明时的类型为其选择一种亲缘类型,当数据插入时,该字段的数据将会优先采取亲缘类型作为该值的存储方式,除非亲缘类型不匹配或没法转换当前数据到该亲缘类型,这样SQLite才会斟酌其它更合适该值的类型存储该值。SQLite目前的版本支持以下五种亲缘类型:

亲缘类型 描写  
TEXT 数值型数据在被插入之前,需要先被转换为文本格式,以后再插入到目标字段中。
NUMERIC 当文本数据被插入到亲缘性为NUMERIC的字段中时,如果转换操作不会致使数据信息丢失和完全可逆,那末SQLite就会将该文本数据转换为INTEGER或REAL类型的数据,如果转换失败,SQLite仍会以TEXT方式存储该数据。对NULL或BLOB类型的新数据,SQLite将不做任何转换,直接以NULL或BLOB的方式存储该数据。需要额外说明的是,对浮点格式的常量文本,如”30000.0″,如果该值可以转换为INTEGER同时又不会丢失数值信息,那末SQLite就会将其转换为INTEGER的存储方式。
INTEGER 对亲缘类型为INTEGER的字段,其规则同等于NUMERIC,唯一差别是在履行CAST表达式时。
REAL 其规则基本同等于NUMERIC,唯一的差别是不会将”30000.0″这样的文本数据转换为INTEGER存储方式。
NONE 不做任何的转换,直接以该数据所属的数据类型进行存储。  

1. 决定字段亲缘性的规则:

字段的亲缘性是根据该字段在声明时被定义的类型来决定的,具体的规则可以参照以以下表。需要注意的是以以下表的顺序,即如果某一字段类型同时符合两种亲缘性,那末排在前面的规则将先产生作用。
1). 如果类型字符串中包括”INT”,那末该字段的亲缘类型是INTEGER。
2). 如果类型字符串中包括”CHAR”、”CLOB”或”TEXT”,那末该字段的亲缘类型是TEXT,如VARCHAR。
3). 如果类型字符串中包括”BLOB”,那末该字段的亲缘类型是NONE。
4). 如果类型字符串中包括”REAL”、”FLOA”或”DOUB”,那末该字段的亲缘类型是REAL。
5). 其余情况下,字段的亲缘类型为NUMERIC。

2. 具体示例:

声明类型 亲缘类型 利用规则
INT
INTEGER
TINYINT
SMALLINT
MEDIUMINT
BIGINT
UNSIGNED BIG INT
INT2
INT8
INTEGER 1
CHARACTER(20)
VARCHAR(255)
VARYING CHARACTER(255)
NCHAR(55)
NATIVE CHARACTER(70)
NVARCHAR(100)
TEXT
CLOB
TEXT 2
BLOB NONE 3
REAL
DOUBLE
DOUBLE PRECISION
FLOAT
REAL 4
NUMERIC
DECIMAL(10,5)
BOOLEAN
DATE
DATETIME
NUMERIC 5

注:在SQLite中,类型VARCHAR(255)的长度信息255没有任何实际意义,仅仅是为了保证与其它数据库的声明一致性。

三、比较表达式:

在SQLite3中支持的比较表达式有:”=”, “==”, “<“, “<=”, “>”, “>=”, “!=”, “<>”, “IN”, “NOT IN”, “BETWEEN”, “IS” and “IS NOT”。
数据的比较结果主要依赖于操作数的存储方式,其规则为:
1). 存储方式为NULL的数值小于其它存储类型的值。
2). 存储方式为INTEGER和REAL的数值小于TEXT或BLOB类型的值,如果同为INTEGER或REAL,则基于数值规则进行比较。
3). 存储方式为TEXT的数值小于BLOB类型的值,如果同为TEXT,则基于文本规则(ASCII值)进行比较。
4). 如果是两个BLOB类型的数值进行比较,其结果为C运行时函数memcmp()的结果。

四、操作符:

所有的数学操作符(+, -, *, /, %, <<, >>, &, and |)在履行之前都会先将操作数转换为NUMERIC存储类型,即便在转换进程中可能会造成数据信息的丢失。另外,如果其中一个操作数为NULL,那末它们的结果亦为NULL。在数学操作符中,如果其中一个操作数看上去其实不像数值类型,那末它们结果为0或0.0。

本文来源:https://www.yuntue.com/post/151383.html | 云服务器网,转载请注明出处!

关于作者: yuntue

云服务器(www.yuntue.com)是一家专门做阿里云服务器代金券、腾讯云服务器优惠券的网站,这里你可以找到阿里云服务器腾讯云服务器等国内主流云服务器优惠价格,以及海外云服务器、vps主机等优惠信息,我们会为你提供性价比最高的云服务器和域名、数据库、CDN、免费邮箱等企业常用互联网资源。

为您推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注