码迷,mamicode.com
首页 > 数据库 > 详细

SQLite 3 中的数据类型

时间:2017-05-05 14:13:19      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:它的   lint   cell   float   浮点数   概念   blob   nvarchar   兼容   

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
INT8
INETGER 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

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

SQLite 3 中的数据类型

标签:它的   lint   cell   float   浮点数   概念   blob   nvarchar   兼容   

原文地址:http://www.cnblogs.com/yzl050819/p/6812373.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!