SQLite 3 中的数据类型

来源:互联网 发布:库控制软件 编辑:程序博客网 时间:2024/05/22 03:16

。SQLite使用动态类型系统,在SQLite中,值的数据类型和值本身,而不是和它的容器,关联在一起的。SQLite的动态类型系统和其他数据库引擎的静态类型系统是兼容的,这样在静态类型的数据库上执行的SQL语句也可以在SQLite中执行。

1.0 存储类和数据类型

每个存储在SQLite数据库中(或被数据库引擎操纵的)的值都有下列存储类的一个:

  • NULL。空值。
  • INTEGER。有符号整数,存储在1、2、3、4、6或8个字节中。
  • REAL。浮点数,存储为8字节的IEEE浮点数。
  • TEXT。文本串,使用数据库编码(UTF-8, UTF-16BE或UTF-16LE)存储。
  • BLOB。大块数据。

注意存储类(storage class)比数据类型更一般。INTEGER存储类,例如,包含6种长度不同的整数数据类型。这在磁盘中是有区别的。不过一旦INTEGER值从磁盘读到内容中进行处理的时候,这些值会转化为更普通的数据类型(8位有符号整数)。因此在大部分情况下,存储类和数据类型是不易分辨的,这两个术语可以交换使用。

在SQLite 3 数据库中,任何列,除了INTEGER PRIMARY KEY列,都可以存储任何存储类的值。

SQL语句中的所有值,不管是SQL语句中嵌入的字面值,还是预编译的SQL语句中的参数,都有一个隐式的存储类。在下面描述的条件下,在查询执行阶段,数据库引擎可能会在数字存储类(INTEGER和REAL)和TEXT存储类之间转换。

1.1 Boolean数据类型

SQLite没有单独的Boolean存储类,相反,Booean值以整数0(false)和1(true)存储。

1.2 日期和时间数据类型

SQLite没有为存储日期和/或时间设置专门的存储类,相反,内置的日期和时间函数能够把日期和时间作为TEXT,REAL或INTEGER值存储:

  • TEXT:作为ISO8601字符串("YYYY-MM-DD HH:MM:SS.SSS")。
  • REAL:作为Julian天数,……
  • INTEGER:作为Unix Time,即自1970-01-01 00:00:00 UTC以下的秒数。

2.0 类型相像(type affinity)

为了最大化SQLite和其他数据库引擎之间的兼容性,SQLite支持列的”类型相像“的概念。这里重要的思想是,类型是推荐的,不是必需的。任何列仍然能够存储任何类型的数据。只是某些列,能够选择优先使用某种存储类。这个对列的优先存储类称作它的”相像“。

SQLite 3 数据库中的每个列都赋予下面类型相像中的一个:

  • TEXT
  • NUMERIC
  • INTEGER
  • REAL
  • NONE

带有TEXT相像的列会使用存储类NULL、TEXT或BLOB来存储所有的数据。如果数据数据被插入到带有TEXT相像的列中,它会在插入前转换为文本格式。

带有NUMERIC相像的列可以使用所有5个存储类来包含值。当文本数据被插入到一个NUMERIC列,文本的存储类会被转换成INTEGER或REAL(为了优先),如果这个转换是无损的和可逆的话。如果TEXT到INTEGER或REAL的转换是不可能的,那么值会使用TEXT存储类存储。不会试图转换NULL或BLOB值。

……

2.1 列相像的确定

列相像是由列声明的类型确定的,规则是按照下面的顺序:

1. 如果声明的类型包含字符串”INT“那么它被赋予INTEGER相像。

2. 如果列声明的类型包含任何字符串”CHAR“,”CLOB“,或”TEXT“,那么此列拥有TEXT相像。注意类型VARCHAR包含”CHAR“,因此也会赋予TEXT相像。

3. 如果列声明的类型包含”BLOB“或没有指定类型,那么此列拥有NONE相像。

4. 如果列声明的类型包含任何”REAL“,”FLOA“,或”DOUB“,那么此列拥有REAL相像。

5. 其他情况,相像是NUMERIC。

注意规则的顺序是重要的。声明类型为“CHARINT”的列同时匹配规则1和规则2,但第一个规则会优先采用,因此此列的相像是INTEGER。

2.2 相像示例

示例相像结果规则INT
INTEGER
TINYINT
SMALLINT
MEDIUMINT
BIGINT
UNSIGNED BIG INT
INT2
INT8INETGER1CHARACTER(20)
VARCHAR(255)
VARYING CHARACTER(255)
NCHAR(55)
NATIVE CHARACTER(70)
NVARCHAR(100)
TEXT
CLOBTEXT2BLOB
未指定数据类型NONE3REAL
DOUBLE
DOUBLE PRECISION
FLOATREAL4NUMERIC
DECIMAL(10, 5)
BOOLEAN
DATE
DATETIMENUMERIC5

注意“FLOATING POINT”类型会指定INTEGER相像,而不是REAL相像,因为”INT“在末尾。”STRING“类型会拥有NUMERIC相像,而不是TEXT。

原创粉丝点击