您的当前位置:首页正文

SQLite3中存储类型和数据类型结合文档解析

2020-11-09 来源:步旅网

SQLite3是个很小的数据库,运行在手机,机顶盒上....那它就不可能像musql,sqlserver那么规范,有很多的数据类型,之前我也以为它

SQLite3是个很小的数据库,运行在手机,机顶盒上....那它就不可能像musql,sqlserver那么规范,有很多的数据类型,之前我也以为它定义了很多数据类型,其实不是他就5个存储类,那么多数据类型是根据一整套严谨的规则映射的!!还有什么char,varchar其实都是没有的..下面将结合文档详细讲解,相信看完你会了解更多,其实主要就是翻译文档....

sqlite官网:

Sqlite3数据类型

大多数的数据库引擎(到现在据我们所知的除了sqlite的每个sql数据库引擎)都使用静态的、刚性的类型,使用静态类型,数据的类型就由它的容器决定,这个容器是这个指被存放的特定列。
Sqlite使用一个更一般的动态类型系统,sqlite中,值的数据类型跟值本身相关,而不是与它的容器相关。Sqlite的动态类型系统和其他数据库的更为一般的静态类型系统相兼容,但同时,sqlite中的动态类型允许它能做到一些传统刚性类型数据库所不可能做到的事。

//这说的有点抽象,简单的意思就是存储的值和列的类型是分开的,列的类型可以有很多,而存储的类型就5个,这也是为什么sqlite这么小却能支持那么多数据类型的原因。就像映射一样,sqlite有一套自己的数据类型到存储类型的映射。

1存储类型和数据类型

1.0存储类型

每一个值存储在一个SQLite数据库(或操作的 数据库引擎)都有以下的一个存储类(真正存在数据库中):

从上可以看出存储类比数据类型更一般化。比如INTEGER存储类,包括6中不同长度的不同整形数据类型,这在磁盘上造成了差异。但是只要INTEGER值被从磁盘读出进入到内存进行处理,它们被转换成最一般的数据类型(8-字节有符号整形)。

Sqlite v3数据库中的任何列,除了整形主键列,可以用于存储任何一个存储类型的值。

· sql语句中的中所有值,不管它们是嵌入在sql文本中或者是作为参数绑定到一个预编译的sql语句,它们的存储类型都是未定的。在下面描述的情况中,数据库引擎会在查询执行过程中在数值(numeric)存储类型(INTEGER和REAL)和TEXT之间转换值。

1.1布尔类型

Sqlite没有单独的布尔存储类型,它使用INTEGER作为存储类型,0为false,1为true

1.2 Date和Time Datatype

Sqlite没有另外为存储日期和时间设定一个存储类集,内置的sqlite日期和时间函数能够将日期和时间以TEXT,REAL或INTEGER形式存放
l). TEXT 作为IS08601字符串("YYYY-MM-DD HH:MM:SS.SSS")
2). REAL 从格林威治时间11月24日,4174 B.C中午以来的天数
3). INTEGER 从 1970-01-01 00:00:00 UTC以来的秒数
程序可以任意选择这几个存储类型去存储日期和时间,并且能够使用内置的日期和时间函数在这些格式间自由转换

2.0 类型近似 (sqlite的数据集合)

为了使sqlite和其他数据库间的兼容性最大化,sqlite支持列上“类型近似”的观点,列的类型近似指的是存储在列上数据的推荐类型。这里必须记住一点,这个类型是被推荐,而不是必须的。任何列仍然能存储任意类型的数据。只是一些列,给予选择的话,将会相比于其他的一些类型优选选择一些存储类型,这个列优先选择的存储类型被称为它的“近似”。
每个sqlite3数据库中的列都被赋予下面类型近似中的一种:
1). TEXT
2). NUMERIC
3). INTEGER
4). REAL
5). BLOB (BLOB过去叫做NONE,不过这个词更容易混淆“没有近似”)

具有TEXT近似的列可以用NULL,TEXT或者BLOB类型存储数据。如果数值数据被插入到具有TEXT近似的列,在被存储前被转换为文本形式
一个有NUMERIC近似的列可以使用所有5中存储类来存储数据。当文本数据被存放到NUMERIC近似的列中,这个文本的存储类被转换到INTEGER或REAL(根据优先级顺序),如果这个转换是无损的话。对于TEXT和REAL存储类间的转换,如果数据的前15位的被保留的话sqlite就认为这个转换是无损的、可反转的。如果TEXT到INTEGER或REAL的转换不可避免的会造成损失,那么数据将使用TEXT存储类存储。不会企图去转换NULL或BLOB值。

一个字符串可能看起来像浮点数据,,有小数点或指数符号,但是只要这个数据可以使用整形存放,NUMERIC近似就会将它转换到整形。比如,字符串 '3.0e+5'存放到一个具有NUMERIC近似的列中,被存为300000,而不是浮点型值300000.0。
具有INTEGER近似的列和具有NUMERIC近似的列表现相同。它们之间的差别仅处于转换描述上。
具有REAL近似的列和具有NUMERIC近似的列一样,除了它将整形数据转换成浮点型形式。
具有BLOB近似的列不会优先选择一个存储列,也不会强制将数据从一个存储类转换到另外一个类。

2.1列近似的决定因素 (映射关系)

列的近似由这个列的声明类型所决定,根据下面的规则:

1) 如果声明类型包含”INT”字符串,那么这个列被赋予INTEGER近似

2)如果这个列的声明类型包含”CHAR”,”CLOB”,或者”TEXT”中的任意一个,那么这个列就有了TEXT近似。注意类型VARCHAR包含了”CHAR”字符串,那么也就被赋予了TEXT近似

3) 如果列的声明类型中包含了字符串”BLOB”或者没有为其声明类型,这个列被赋予BLOB近似

4)如果列的声明类型包含 “REAL”,”FLOA”,”DOUB”中任何一个,那么这个列就是REAL近似。

5)其他的情况,列被赋予NUMERIC近似
**上面规则顺序对于决定列的近似很重要。一个列的声明类型为”CHARINT”的话同时会匹配规则1和2,但是第1个规则优先,所以这个列的近似将是INTEGER。

2.2近似名称例子 (映射函数)

(下面这个表显示了多少来自更传统的SQL操作的普通数据类型名称,使用上一节中的5个规则,被转换到近似类型。这个表只显示了sqlite能够接受的数据类名称的一个子集。注意到跟随类型名的圆括号内的数值参如:”VARCHAR(255)”)被sqlite忽略—sqlite不在字符串、BLOBS或者数值的长度上强加任何长度限制(除了一个全局的SQLITE_MAX_LENGTH限制)。//就是说加括号也没用,所以不用加 ,之前我还一直加。

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

BLOB

3

REAL
DOUBLE
DOUBLE PRECISION
FLOAT

REAL

4

NUMERIC
DECIMAL(10,5)
BOOLEAN
DATE
DATETIME

NUMERIC

5

注意到声明类型为”FLOATING POINT”将被赋予INTEGER近似,而不是REAL近似,因为”INT”在”POINT”后边。

声明类型为”STRING”的将被赋予NUMERIC,不是TEXT。(不动可以看2.1的规则,这是用了规则5)

显示全文