SQLite数据类型
SQLite数据类型
SQLite数据类型SQLite的数据类型则采用了动态类型,列定义不能决定值的存储,值的存储由值本身决定,因此在SQLite中,同一列会有多种存储方式。
尽管SQLite为我们提供了这种方便,但是一旦考虑到数据库平台的可移植性问题,我们在实际的开发中还是应该尽可能的保证数据类型的存储和声明的一致性。
一、存储类型(Storage Class)
1、数据保存到文件后的表现形式。
2、SQLite根据值的存储划分为以下几种存储类型:
存储类别 | 含义 |
NULL | 空值 |
INTERGER | 有符号整数类型,根据值大小控制存储占用的字节数,可能为1,2,3,4,6 or 8个字节 |
REAL | 浮点数类型,采用8个字节存储,实质是采用double存储,有效数字为15位 |
TEXT | 字符串(其编码取决于DB的编码) |
BLOB | 存储二进制数据,默认最大可以存储1G个字节 |
3、备注
(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提供typeof函数,用户可以根据这个函数来确定给定值的存储类型。
二、亲和类型(Type Affinity)
为了最大化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)、如果类型字符串中包含"INT",那么该字段的亲缘类型是INTEGER。
2)、如果类型字符串中包含"CHAR"、"CLOB"或"TEXT",那么该字段的亲缘类型是TEXT,如VARCHAR。
3)、如果类型字符串中包含"BLOB",那么该字段的亲缘类型是NONE。
4)、如果类型字符串中包含"REAL"、"FLOA"或"DOUB",那么该字段的亲缘类型是REAL。
5)、其余情况下,字段的亲缘类型为NUMERIC。
三、声明类型(Declared Type)
CREATE TABLE/ALTER TABLE 语句中声明的列的类型
声明类型 | 亲缘类型 |
INT INTEGER TINYINT SMALLINT MEDIUMINT BIGINT UNSIGNED BIG INT INT2 INT8 |
INTEGER |
CHARACTER(20) VARCHAR(255) VARYING CHARACTER(255) NCHAR(55) NATIVE CHARACTER(70) NVARCHAR(100) TEXT CLOB |
TEXT |
BLOB | NONE |
REAL DOUBLE DOUBLE PRECISION FLOAT |
REAL |
NUMERIC DECIMAL(10,5) BOOLEAN DATE DATETIME |
NUMERIC |
备注:在SQLite中,类型VARCHAR(255)的长度信息255没有任何实际意义,仅仅是为了保证与其它数据库的声明一致性。