SQLite3数据类型
NULL
1.存储类别 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. 列之间的亲和性 为了最大限度的增加SQLite数据库和其他数据库的兼容性,SQLite支持列的"类型亲和性". 列的亲和性是为该列所存储的数据建议一个类型.我们要注意是建议而不是强迫.在理论上来讲,任何列依然是可以存储任何类型的数据的. 只是针对某些列,如果给建议类型的话,数据库将按所建议的类型存储.这个被优先使用的数据类型则被称为"亲和类型". 在SQLite3.0版中,数据库中的每一列都被定义为以下亲和类型中的一种: 文本 一个具有数字类型亲和性的列也许使用所有的五个存储类型存储值.当文本数据被插入一个数字列时,在存储之前,数据库将尝试着把文本转换成整数或实数.如果能成功转换的话,值将按证书活实数的类型被存储. 如果不能 成功转换的话,值则只能按文本类型存储了,而不会被转换成无类型或BLOB类型来存储. 一个具有整数亲和力的列在转换方面和具有数字亲和力的列是一样的,但也有些区别,比如没有浮动量的实值(文本值转换的值)被插入具有整数亲和力的列时,它将被转换成整数并按整数类型存储. 一个具有无类型亲和力的列不会优先选择使用哪个类型.在数据被输入前它不会强迫数据转换类型. 2.1 列的亲和性的决定 如果数据类型包括字符串"INT"那么它被定义成具有整数亲和性. 如果列中的数据类型包括以下任何的字符串 "CHAR","CLOB",or "TEXT" 那么这个列则具有文本亲和性.要注意VARCHAR类型包括字符串"CHAR"因此也具有文本类型亲和性. 如果一个列的数据类型包括字符串"BLOB"或者如果数据类型被具体化了,那么这个列具有无类型亲和性. 否则就具有数字类型亲和性. 如果表格使用If "CREATE TABLE AS SELECT..."语句生成的,那么所有的列则都没有具体的数据类型,则没有类型亲和性. 2.2 列的亲和性的例子 -- Storage classes for the following row: INSERT INTO t1 VALUES(500.0,500.0,500.0); 3.比较表达式 比较的结果决定于被比较的两个值的存储类型。遵循以下规则: 一个具有空存储类型的值被认为小于任何值(包括另外一个具有空存储类型的值)。 一个整数值或实数值小于任何文本值和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 比较例子 INSERT INTO t1 VALUES('500','500','500'); -- 60 and 40 are converted to '60' and '40' and values are compared as TEXT. -- Comparisons are numeric. No conversions are required. -- Both 60 and 600 (storage class NUMERIC) are less than '500' 4. 运算符 对于连接作用操作符,所有操作符将首先具有文本亲和性。如果其中任何一个操作符不能被转换为文本(因为它是空值或是BLOB)连接作用操作符将是空值。 5. 分类,排序,混合挑选 When grouping values with the 当用GROUP BY子句给值分组时,具有不同存储类型的值被认为是不同的,但也有例外,比如,一个整数值和一个实数值从数字角度来说是相等的,那么它们则是相等的.用GROUP by 子句比较完后,值不具有任何亲和性. 混合挑选操作符UNION,INTERSECT and EXCEPT 在值之间实行绝对的比较,同样的亲和性将被应用于所有的值,这些值将被存储在一个单独的具有混合SELECT的结果组的列中. 被赋予的亲和性是该列的亲和性,这个亲和性是由剩下的大部分的混合SELECTS返回的,这些混合SELECTS在那个位置上有列值(而不是其它类型的表达式). 如果一个给定的混合SELECT列没有SELECTS的量,那么在比较前,该列的值将不具有任何亲和性. 6. 其它亲和性模式 严格亲和性模式.在这种模式下,如果需要值之间相互转换数据存储类型的话,数据库引擎将发送错误报告,当前语句也将会重新运行. 无亲和性模式.在这种模式下,值的数据存储类型不发生转换.具有不同存储类型的值之间不能比较,但整数和实数之间可以比较. 7.用户定义的校对顺序 除了系统预设的BINARY比较顺序,它是用memcmp()函数比较,SQLite还包含了两个额外的内置比较顺序函数,NOCASE和REVERSE: BINARY -使用memcmp()比较字符串数据,不考虑文本编码. 当用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 比较顺序的例子 CREATE TABLE t1( -- Text comparison is performed using the BINARY collation sequence. -- Text comparison is performed using the NOCASE collation sequence. -- Text comparison is performed using the BINARY collation sequence. -- Text comparison is performed using the REVERSE collation sequence. -- Text comparison is performed using the REVERSE collation sequence. -- Grouping is performed using the NOCASE collation sequence (i.e. values -- Grouping is performed using the BINARY collation sequence. -- Sorting is performed using the REVERSE collation sequence. -- Sorting is performed using the BINARY collation sequence. -- Sorting is performed using the NOCASE collation sequence. SELECT * FROM t1 ORDER BY c COLLATE NOCASE; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |