【转贴】SQLite3的数据类型

NULL 
INTEGER 
REAL 
TEXT 
BLOB 
然而实在,sqlite3也经受如下的数据类型: 
smallint 16 各类第一的整数。 
interger 32 位首位之平头。 
decimal(p,s) p 精确值和 s
大小的十迈入号整数,精确值p是依赖合发出几乎独数(digits)大小值,s是凭借小数点後来几各数。如果无特意指定,则网会要为
p=5; s=0 。 
float   32位正之实数。 
double   64号第一之实数。 
char(n)   n 长度的字串,n不可知过 254。 
varchar(n) 长度不稳定且该最为要命尺寸也 n 的字串,n不能够超过 4000。 
graphic(n) 以及 char(n) 一样,不了那单位是少数只字元 double-bytes,
n不克跨越127。这个样是为帮忙两个字首长的书体,例如中文字。 
vargraphic(n) 可转换长都该极其深尺寸也 n 的对仗配首字串,n不可知跳 2000 
date   包含了 年份、月份、日期。 
time   包含了 小时、分钟、秒。 
timestamp 包含了 年、月、日、时、分、秒、千分之一秒。

 

1.存储类别 
亚本子将持有列的价都存储成ASCII文本格式。第三版则可把数量存储成整数和实数,还足以存储BLOB数据.

Each value stored in an
SQLite数据库被蕴藏的每个值都来一个性,都属于下面所列类中之一律栽,(被数据库引擎所决定)

空.这个价值吗空值

整数.值被标识为整数,依据值的尺寸可以依次被储存吗1,2,3,4,5,6,7,8.

实数. 所有值都是别的数值,被储存吗8字节之IEEE浮动标记序号.

文本. 值为文本字符串,使用数据库编码存储(TUTF-8, UTF-16BE or UTF-16-LE).

BLOB. 值是BLOB数据,如何输入就怎么样存储,不改格式.

诸如SQLite2.0版一样,在3.0版本受,除了INTEGER PRIMARY
KEY,数据库被之其它列都得储存任何类型的数据.这无异平整也发生差,在脚的”严格相似模式”中将描述.

输入SQLite的有值,不管她是停放
SQL语句被之亲笔或提前编译好的绑定在SQL语句被之价,在SQL语句执行前还深受积存吗一个类.在下面所描述的场面下,数据库引擎将当履行时检查并拿价值当数字存储类(整数和实数)和文件类间转换.

囤的种最初给归类为如下:

现实的值比如SQL语句部分的带双引号或单引号的文字被定义为文本,如果文字没带引号并没小数点或指数则给定义为整数,如果文字没带引号但出小数点或指数虽然被定义为实数,如果值是空则被定义也空值.BLOB数据应用标志X’ABCD’来标识.

Values supplied using the 被输入的价值使用sqlite3_bind_*
APIs的于归类一个仓储等,这等是暨原的切近为主相平等的.
(比如sqlite3_bind_blob()绑定一个BLOB的价值).

值的归类是SQL分等级操作的结果,决定让最远之操作表达式.用户定义之功力或会管价值返回任意的类.在编译的早晚来规定表达式的储存类为主是无可能的.

  1. 排里的切身和性 
    每当SQLite3.0版中,值为定义为什么类型只同价值我有关,和列没有涉及,和变量也从没关系.
    (这有时让称作
    弱类型.)所发出另外的我们所动的数据库引擎都受静态类型系统的界定,其中的所有值的类是出于该所属列的性质决定的,而与值无关.

为了最酷限度的增SQLite数据库与其它数据库的兼容性,SQLite支持排的”类型亲和性”.
列的亲和性是为该列所蕴藏的数建议一个类型.我们如果留意是建议一旦非是强迫.在辩论及来讲,任何列依然是好储存任何项目的多寡的.
只是针对性某些列,如果给建议项目的话,数据库将如约所建议的档次存储.这个叫事先利用的数据类型则让誉为”亲和档次”.

于SQLite3.0版被,数据库被的各个一样排列都受定义也坐下亲和品种受到的一致种植:

文本 
数字的 
整数 
无 
一个具备类型亲和性的排列本无类型,文本,或BLOB存储所有的数据.如果数字数据为插入一个持有文本类亲和性的排列,在仓储之前数字将让转移成文本.

一个兼有数字型亲和性的排也许下有的五只存储类型存储值.当文本数据为插一个数字列时,在存储之前,数据库将尝试在将公文转换成整数或实数.如果能成功转移的话,值将仍证书活实数的品类为存储.
如果非能够
成功转移的话,值则只能以文件类存储了,而非会见为更换成为无类型或BLOB类型来存储.

一个装有整数亲和力的排于换点和具备数字亲和力的排是均等的,但为来几区别
,比如没有浮动量的实值(文本值转换的价)被插入具有整数亲和力的排列时,它以给转换成整数并按照整数类型存储.

一个享无类型亲和力的排非会见优先挑选使用谁类型.在数量给输入前其不见面迫使数据易类型.

2.1 列的亲和性的操纵 
一个列的亲自和种是由该列所声明的类型决定的.遵守以下规则:

若果数据类型包括字符串”INT”那么她叫定义成所有整数亲和性.

设若列着的数据类型包括以下任何的字符串 “CHAR”, “CLOB”, or “TEXT”
那么这列则兼具文本亲和性.要小心VARCHAR类型包括字符串”CHAR”因此呢存有文本类型亲和性.

倘一个列的数据类型包括字符串”BLOB”或者一旦数据类型被具体化了,那么是列有无类型亲和性.

要不然即有数字类型亲和性.

而表格使用If “CREATE TABLE AS
SELECT…”语句子生成的,那么具有的列则都没具体的数据类型,则从未类型亲和性.

2.2 列的亲和性的例证 
CREATE TABLE t1( 
    t TEXT, 
    nu NUMERIC, 
    i INTEGER, 
    no BLOB 
);

— Storage classes for the following row: 
— TEXT, REAL, INTEGER, TEXT 
INSERT INTO t1 VALUES(‘500.0’, ‘500.0’, ‘500.0’, ‘500.0’);

— Storage classes for the following row: 
— TEXT, REAL, INTEGER, REAL 
INSERT INTO t1 VALUES(500.0, 500.0, 500.0, 500.0);

3.较表达式 
诸如SQLite2.0版本一致,3.0版本的一个特色是二进制比较符’=’, ‘<‘, ‘<=’,
‘>=’ and ‘!=’,一个操作’IN’可以测试固定的积极分子身价,
三再度之比操作符’BETWEEN’.

较的结果决定为受比较的简单独价的蕴藏类型。遵循以下规则:

一个所有空存储类型的价为当小于任何价值(包括另外一个享有空存储类型的价)。

一个整数值或实数值小于任何文本值和BLOB值。
当一个整数或实数和任何一个平头或实数相较的时候,则按照实际数值来比。

一个文本值小于BLOB值。当半单文本值相较的上,则用C语言类库中之memcmp()函数来比。然而,有时候也未是这样的,比如当脚所描述的“用户定义的整理顺序”情况下。

当半只BLOB文本被于的时,结果决定于memcmp()函数。

在开始于前面,SQLite尝试着把价值在数字存储级(整数和实数)和文书中相转换。下面列举了有关什么比较二迈入制值的例证。在正在重号below中以的表达式可以表示SQL标量表达式或是文本但切莫是一个列值。

当一个列值被比较为表达式结果的时刻,在可比起前,列的亲和性将被运在发挥结果中。

当半独列值比较的时候,如果一个列有整数或数字亲和性的时刻,而另外一排却没有,那么数字亲和性适用于由非数字列提取的外拥有文本存储类型的值.
P>

当于少只表达式的结果经常,不发出任何移,直接比较结果.如果一个字符串和一个数字较,
数字连续小于字符串.

每当SQLite中, 表达式”a BETWEEN b AND c”等于表达式 “a >= b AND a <=
c”,在比表达式时,a可以是装有任何亲和性.

抒式 “a IN (SELECT b ….)”
在较时以上面所提到的老三修规则,是二进制比较.(例如, 在一个相似之样式 “a
= b”). 例如,如果’b’是一个列值, ‘a’
是一个表达式,那么,在起于前面,’b’的亲和性就深受换为’a’的亲和性了.

SQLite把发表式 “a IN (x, y, z)” 和 “a = z OR a = y OR a = z”视为相等.

3.1 比较例子 
CREATE TABLE t1( 
    a TEXT, 
    b NUMERIC, 
    c BLOB 
);

— Storage classes for the following row: 
— TEXT, REAL, TEXT 
INSERT INTO t1 VALUES(‘500’, ‘500’, ‘500’);

— 60 and 40 are converted to ’60’ and ’40’ and values are compared as
TEXT. 
SELECT a < 60, a < 40 FROM t1; 
1|0

— Comparisons are numeric. No conversions are required. 
SELECT b < 60, b < 600 FROM t1; 
0|1

— Both 60 and 600 (storage class NUMERIC) are less than ‘500’ 
— (storage class TEXT). 
SELECT c < 60, c < 600 FROM t1; 
0|0

  1. 运算符 
    具有的数学运算符(所有的运算符而无是息息相关作用标记符”||”)运算对象首先具有数字亲和性,
    如果一个也许两独还无能够叫转换为数字那么操作的结果将凡空值。

于连续图操作符,所有操作符将第一具有文本亲和性。如果中间任何一个操作符不能够被转换为文本(因为她是空值或是BLOB)连接图操作符将是空值。

  1. 分拣,排序,混合挑选 
    当用子句ORDER挑选值时,空值首先给选择出去,
    然后是整数和实数按梯次为选出, 然后是文本值按memcmp()顺序为增选出去,
    最后是BLOB值按memcmp()顺序为挑选出来.在挑之前,
    没有存储类型的价都让换了.

When grouping values with the 当用GROUP
BY子句子被值分组时,具有不同存储类型的价值为认为是例外之, 但也时有发生例外,
比如,一个整数值和一个实数值从数字角度来说是相当的,那么其则是当的.用GROUP
by 子句比较了晚,值未有其他亲和性.

夹挑选操作符UNION, INTERSECT and EXCEPT
在值期间实行绝对的比,同样的亲和性将为应用叫具有的值,这些价值将吃积存于一个独的有着混合SELECT的结果组的列中.
被与的亲和性是该列的亲和性,这个亲和性是出于剩余的大部分的混合SELECTS返回的,这些混合SELECTS在老位置及出列值(而未是其余门类的表达式).
如果一个加的混合SELECT列没有SELECTS的量,
那么当比前面,该列的值将非享其他亲和性.

  1. 另外亲和性模式 
    上述的有所描述的还是数据库引擎在健康亲和性模式下所开展的操作,
    SQLite将叙其它少种植亲和性模式,如下:

严酷亲和性模式.在这种模式下,如果要价值内相互转换数据存储类型的话,数据库引擎将发送错误报告,当前说话为用会又运行.

无亲和性模式.在这种模式下,值的数额存储类型不来转换.具有不同存储类型的价期间未克于,但整数和实数之间可比较.

7.用户定义的校顺序 
By default, when
当SQLite比较简单个文本值的当儿,通过系统设定,不管字符串的编码是呀,用memcmp()来比.
SQLite第三本允许用户提供任意的函数来代表memcmp(),也就是用户定义的于顺序.

除开系统预设的BINARY比较顺序,它是为此memcmp()函数比较,SQLite还蕴含了少单附加的放权比较顺序函数,
NOCASE和REVERSE:

BINARY -用memcmp()比较字符串数据, 不考虑文本编码. 
REVERSE -用倒序比较二前行制文本. 
NOCASE –
和二进制一样,但以较前面,26个之好写字母盘要为折合成相应的小写字母盘. 
7.1 分配比较顺序 
每个表格中之每个列都发一个预设的可比类型.如果一个比类型不是二进制所求的,比较的子句将让具体化为
列的概念 来定义该列.

当用SQLite比较单薄独文本值时,比较顺序以以以下的平整来决定于的结果.文档的老三部分和第五有些讲述在何种场合下起这种比较.

对二进制比较适合(=, <, >, <= and
>=),如果每个操作数是同等排列的口舌,那么该列的默认比较类型决定为所采取的比较顺序.
如果少独操作数都是排的说话,那么左边的操作数的可比类型决定了所要动的比顺序.如果两只操作数都无是相同排,将祭二进制来比较.

表达式”x BETWEEN y and z”和 “x >= y AND x <= z”是一律的. 表达式”x
IN (SELECT y …)” 和发表式 “x = y”
使用同一的道来操作,这是为了操纵所而以的比顺序.如果X是一模一样列或者二进制的,则”x
IN (y, z …)” 形式之表达式所祭的于顺序是X的默认的可比类型.

ORDER BY clause that is part of a SELECT statement may be assigned a
collation sequence to be used for the sort operation explicitly. In this
case the explicit collation sequence is always used. Otherwise, if the
expression sorted by an ORDER BY clause is a column, then the default
collation type of the column is used to determine sort order. If the
expression is not a column, then the BINARY collation sequence is used.

7.2 比较顺序的事例 
下面的例证介绍了The examples below identify the collation sequences that
would be used to determine the results of text comparisons that may be
performed by various SQL statements. Note that a text comparison may not
be required, and no collation sequence used, in the case of numeric,
blob or NULL values.

CREATE TABLE t1( 
    a,                 — default collation type BINARY 
    b COLLATE BINARY, — default collation type BINARY 
    c COLLATE REVERSE, — default collation type REVERSE 
    d COLLATE NOCASE   — default collation type NOCASE 
);

— Text comparison is performed using the BINARY collation sequence. 
SELECT (a = b) FROM t1;

— Text comparison is performed using the NOCASE collation sequence. 
SELECT (d = a) FROM t1;

— Text comparison is performed using the BINARY collation sequence. 
SELECT (a = d) FROM t1;

— Text comparison is performed using the REVERSE collation sequence. 
SELECT (‘abc’ = c) FROM t1;

— Text comparison is performed using the REVERSE collation sequence. 
SELECT (c = ‘abc’) FROM t1;

— Grouping is performed using the NOCASE collation sequence (i.e.
values 
— ‘abc’ and ‘ABC’ are placed in the same group). 
SELECT count(*) GROUP BY d FROM t1;

— Grouping is performed using the BINARY collation sequence. 
SELECT count(*) GROUP BY (d || ”) FROM t1;

— Sorting is performed using the REVERSE collation sequence. 
SELECT * FROM t1 ORDER BY c;

— Sorting is performed using the BINARY collation sequence. 
SELECT * FROM t1 ORDER BY (c || ”);

— Sorting is performed using the NOCASE collation sequence. 
SELECT * FROM t1 ORDER BY c COLLATE NOCASE;

via http://www.21andy.com/blog/20091211/1489.html

网站地图xml地图