由于SQLite采用的是动态数据类型,而其他传统的关系型数据库使用的是静态数据类型。所以如果想知道SQLite支持那些数据类型,需要先弄清楚:动态数据类型和静态数据类型的区别。
动态数据类型:数据库存储的数据类型和数据输入的类型是动态匹配的,简言之,定义了一个数据库字段为字符串TEXT类型,你也可以存入整型INTEGER的数据。
静态数据类型:数据库存储的数据类型和数据输入的类型要求是一致的。简言之,字段可以存储的数据类型是在表声明时即以确定的。
因此,SQLite和传统关系型数据库它们之间在数据存储方面还是存在着很大的差异。
在SQLite中,存储分类和数据类型也有一定的差别。SQLite 数据类型是一个用来指定任何对象的数据类型的属性。SQLite 中的每一列,每个变量和表达式都有相关的数据类型。您可以在创建表的同时使用这些数据类型。SQLite 使用一个更普遍的动态类型系统。在 SQLite 中,值的数据类型与值本身是相关的,而不是与它的容器相关。这种关系就体现在存储类型和数据类型的转换上,而这种关系映射是使用了Type Affinity的概念。
SQLite的存储类型有下面五种:
存储类 | 描述 |
NULL | 值是一个 NULL 值。 |
INTEGER | 值是一个带符号的整数,根据值的大小存储在 1、2、3、4、6 或 8 字节中。 |
REAL | 值是一个浮点值,存储为 8 字节的 IEEE 浮点数字。 |
TEXT | 值是一个文本字符串,使用数据库编码(UTF-8、UTF-16BE 或 UTF-16LE)存储。 |
BLOB | 值是一个 blob 数据,完全根据它的输入存储。 |
SQLite的Type Affinity有下面五种:
SQLite 支持列上的类型 affinity 概念。任何列仍然可以存储任何类型的数据,但列的首选存储类是它的 affinity。在 SQLite3 数据库中,每个表的列分配为以下类型的 affinity 之一:
Affinity | 描述 |
TEXT | 该列使用存储类 NULL、TEXT 或 BLOB 存储所有数据。 |
NUMERIC | 该列可以包含使用所有五个存储类的值。 |
INTEGER | 与带有 NUMERIC affinity 的列相同,在 CAST 表达式中带有异常。 |
REAL | 与带有 NUMERIC affinity 的列相似,不同的是,它会强制把整数值转换为浮点表示。 |
NONE | 带有 affinity NONE 的列,不会优先使用哪个存储类,也不会尝试把数据从一个存储类强制转换为另一个存储类。 |
下面就是传统关系型数据库数据类型和Type Affinity映射的规则:
Example Typenames From The CREATE TABLE Statement or CAST Expression | Resulting Affinity | Rule Used To Determine Affinity |
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 no datatype specified | NONE | 3 |
REAL DOUBLE DOUBLE PRECISION FLOAT | REAL | 4 |
NUMERIC DECIMAL(10,5) BOOLEAN DATE DATETIME | NUMERIC | 5 |
结论:
SQLite支持那些数据类型:都支持。但是,为了保持逻辑一致性、可移植和简单维护性,建议:定义数据表的字段时使用和SQLite支持的数据存储类型一致的类型。简言之,你就将你的数据类型一一对应到下面的数据类型最好:
存储类 | 描述 |
NULL | 值是一个 NULL 值。 |
INTEGER | 值是一个带符号的整数,根据值的大小存储在 1、2、3、4、6 或 8 字节中。 |
REAL | 值是一个浮点值,存储为 8 字节的 IEEE 浮点数字。 |
TEXT | 值是一个文本字符串,使用数据库编码(UTF-8、UTF-16BE 或 UTF-16LE)存储。 |
BLOB | 值是一个 blob 数据,完全根据它的输入存储。 |
参考:
http://androidren.com/index.php?qa=300&qa_1=sqlite%E6%94%AF%E6%8C%81%E9%82%A3%E4%BA%9B%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B
http://sqlite.org/datatype3.html
Each value stored in an SQLite database (or manipulated by the database engine) has one of the following storage classes:
- NULL. The value is a NULL value.
- INTEGER. The value is a signed integer, stored in 1, 2, 3, 4, 6, or 8 bytes depending on the magnitude of the value.
- REAL. The value is a floating point value, stored as an 8-byte IEEE floating point number.
- TEXT. The value is a text string, stored using the database encoding (UTF-8, UTF-16BE or UTF-16LE).
- BLOB. The value is a blob of data, stored exactly as it was input.