
sqlite3中的数据类型.doc
7页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 分等级操作的结果,决定于最远的操作表达式.用户定义的功能也许会把值返回任意的类.在编译的时候来确定表达式的存储类基本是不可能的. 2. 列之间的亲和性在 SQLite3.0 版中,值被定义为什么类型只和值自身有关,和列没有关系,和变量也没有关系. (这有时被称作 弱类型.)所有其它的我们所使用的数据库引擎都受静态类型系统的限制,其中的所有值的类是由其所属列的属性决定的,而和值无关. 为了最大限度的增加 SQLite 数据库和其他数据库的兼容性,SQLite 支持列的"类型亲和性". 列的亲和性是为该列所存储的数据建议一个类型.我们要注意是建议而不是强迫.在理论上来讲,任何列依然是可以存储任何类型的数据的. 只是针对某些列,如果给建议类型的话,数据库将按所建议的类型存储.这个被优先使用的数据类型则被称为"亲和类型". 在 SQLite3.0 版中,数据库中的每一列都被定义为以下亲和类型中的一种: 文本 数字的 整数 无 一个具有类型亲和性的列按照无类型,文本,或 BLOB 存储所有的数据.如果数字数据被插入一个具有文本类型亲和性的列,在存储之前数字将被转换成文本.一个具有数字类型亲和性的列也许使用所有的五个存储类型存储值.当文本数据被插入一个数字列时,在存储之前,数据库将尝试着把文本转换成整数或实数.如果能成功转换的话,值将按证书活实数的类型被存储. 如果不能 成功转换的话,值则只能按文本类型存储了,而不会被转换成无类型或 BLOB 类型来存储.一个具有整数亲和力的列在转换方面和具有数字亲和力的列是一样的,但也有些区别 ,比如没有浮动量的实值(文本值转换的值)被插入具有整数亲和力的列时,它将被转换成整数并按整数类型存储 .一个具有无类型亲和力的列不会优先选择使用哪个类型.在数据被输入前它不会强迫数据转换类型.2.1 列的亲和性的决定一个列的亲和类型是由该列所宣称的类型决定的.遵守以下规则:1. 如果数据类型包括字符串"INT"那么它被定义成具有整数亲和性 .2. 如果列中的数据类型包括以下任何的字符串 "CHAR", "CLOB", or "TEXT" 那么这个列则具有文本亲和性.要注意 VARCHAR 类型包括字符串"CHAR"因此也具有文本类型亲和性.3. 如果一个列的数据类型包括字符串"BLOB"或者如果数据类型被具体化了,那么这个列具有无类型亲和性.4. 否则就具有数字类型亲和性.如果表格使用 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, TEXTINSERT INTO t1 VALUES('500.0', '500.0', '500.0', '500.0');-- Storage classes for the following row:-- TEXT, REAL, INTEGER, REALINSERT 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 , =),如果每个操作数是一列的话,那么该列的默认比较类型决定于所使用的比较顺序. 如果两个操作数都是列的话,那么左边的操作数的比较类型决定了所要使用的比较顺序.如果两个操作数都不是一列,将使用二进制来比较. 表达式"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 BINARYb COLLATE BINARY, -- default collation type BINARYc COLLATE REVERSE, -- default collation type REVERSEd 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 。
