七叶笔记 » 数据库 » 详解SQLite中的数据类型

详解SQLite中的数据类型

 

3.0 比较表达式

同标准SQL一样,SQLite 3支持如下的比较操作符:"=", "==", "<", "<=", ">", ">=", "!=", "<>", "IN", "NOT IN", "BETWEEN", "IS", 以及 "IS NOT"。 3.1 排序规则

比较的结果与操作数的存储类型有关,同时依据以下的规则:

    NULL值小于其他任何值(包括另外一个NULL)     INTEGER或REAL小于TEXT,BLOB值;若两个INTEGER(或者REAL)比较,则按照实际的数值进行。     TEXT小于BLOB,若两个TEXT比较,结果则由适当的整理顺序决定     若两个BLOD比较,与memcmp()的结果一致

3.2 操作数进行比较时的相似性

在进行值的比较之前,SQLite会尝试在存储类INTEGER、REAL和/或TEXT之间进行值的转换。在比较之前尝不尝试进行转换完全取决于操作数的相似性。操作数相似性的判定规则如下:

    只是对一个列中的值进行引用的表达式同被引用的列具有完全相同的相似性。注意,如果X、Y.Z代表的是列的名称,那么+X和+Y.Z可以认为是为了判定其相似性的表达式。     "CAST(expr AS type)"所表示的表达式同类型定义为"type"的列具有完全相同的相似性。     其它情况下的表达式具有NONE相似性。

3.3 比较前的类型转换

“应用相似性”("apply affinity")的意思是,当且仅当所涉及的转换是无损且可逆的情况下,将一个操作数转换为某特定的存储类型。在进行比较之前对比较运算符的操作数应用相似性的规则如下按顺序所示:

    如果其中的一个操作数具有INTEGER、REAL或者NUMERIC相似性而另外一个操作数具有TEXT或者NONE相似性,那么就要对这另外一个操作数应用NUMERIC 相似性。     如果其中的一个操作数具有TEXT相似性而另外一个具有NONE相似性,那么就要对这另外一个操作数应用TEXT相似性。     其它情况下不会应用任何相似性,两个操作数按照各自的原样进行比较。

将表达式"a BETWEEN b AND c"看作两个单独的二元比较运算"a >= b AND a <= c",即使这么一来,可能会造成其中的a在两次比较中会被应用不同的相似性,也要这么处理。Datatype conversions in comparisons of the form 在"x IN (SELECT y ...)"这种形式的比较中,数据类型的转换完全同"x=y"一样进行处理。表达式"a IN (x, y, z, ...)" 同"a = +x OR a = +y OR a = +z OR ..."等价。换句话说,IN运算符右侧的值(本例中就是"x", "y", and "z")被看作是无相似性的,即使它们凑巧是某列的值或者是CAST表达式。

3.4 比较示例  

若示例中的比较被替换——例如"a<40"被写作"40>a"——所有的结果依然相同相同。 4.0 操作符

所有的数学运算符(+, -, *, /, %, <<, >>, &, and |)在展开前会将两个操作数放入 NUMERIC 储存类。即使这个过程是有损和不可逆转的。一个 NULL 操作数在数学运算符上产生一个 NULL 结果。在数算运算符上的操作数不被视为数字,NULL 并不会被转为0或0.0。

5.0 排序, 分组 和 组合查询

当查询结果使用 ORDER BY 子句排序时, 存储类型的NULL空值是排在第一位的, 其次是INTEGER和散布在数字顺序的REAL数据, 其次是按照核对序列顺序的TEXT值, 最后为memcmp() order 的BLOB值. 排序之前不会出现任何存储类型转换.

当使用GROUP BY 子句分组时不同类型的值被认为是不同的数据, 除了INTEGER 和 REAL 值如果他们数值相等则被认为是相同的的数据. 没有任何亲和性适用于GROUP BY 子句结果的任意值.

组合查询使用 UNION, INTERSECT 和 EXCEPT 在数据之间执行隐式的比较. 没有任何亲和性适用于与UNION, INTERSECT, 或者 EXCEPT关联的隐式比较的运算数  - 数据的比较就像这样.

6.0 整理序列

当 SQLite 比较两个字符串时,它使用一个整理序列或整理函数(一物两表)来决定当两个字符串相同时,哪个字符串值更高。SQLite 拥有三个内建整理函数:BINARY, NOCASE, 和 RTRIM。

    BINARY - 使用 memcmp() 比较字符串,无视文本编码。     NOCASE - 与二进制比较相同,除了 ASCII 的26个大写字母在比较前将会转为其小写形势。注意,只有 ASCII 字符会大小写转化。 由于表大小的需求,SQLite 并不会尝试 UTF 大小写转化。     RTRIM - 与二进制比较相同,除了尾部空格符将被忽略。

应用可以通过 sqlite3_create_collation() 接口注册额外的整理函数。

6.1 设定SQL中的排列顺序

每个表中的每一个列都具有一个相关的排序函数。如果没有显式地定义排序函数,那么,就会缺省使用BINARY作为排序函数。列定义中的COLLATE子句可为列定义一个可选的排序函数。

对于二元比较运算符(=, <, >, <=, >=, !=, IS, and IS NOT)来说,判定到底使用哪个排序函数的规则按顺序如下所列:

    如果两个操作数中有任意一个操作数具有使用后缀COLLATE运算符显式定义的排序函数,那么就会用该函数进行比较,如果两个操作数都有的情况下,优先使用左操作数的排序函数。     如果两个操作数中任意一个操作数是一个列,那么就会使用该列的排序函数进行比较,但在两个操作数都是列的情况下,优先使用左操作数对应的列的排序函数。为了达到这句话的目的,列名前带有1个或多个一元运算符"+"的,仍然按原列名处理。     其它情况下,采用BINARY排序函数进行比较。

比较运算中的操作数,如果在它的任何子表达式中使用了后缀 COLLATE运算符,就可以认为是具有显式的排序函数(上文中的规则1)。 再者,如果在比较表达式中的任何地方使用了 COLLATE运算符,那么该运算符所定义的排序函数就会用于字符串的比较,而无论在表达式中出现了表中的哪一列。如果在比较中的任何地方出现了两个或多个 COLLATE运算符子表达式,无论在表达式中嵌入得多深,也无论表达式是怎么使用括号的,都会使用出现在最左侧的显式排序函数。

表达式"x BETWEEN y and z"从逻辑上讲,同"x >= y AND x <= z"这两个比较运算完全等价,在使用排序函数时它们俩要象两个本来就是独立的比较运算一样进行处理。在判定排列顺序时,表达式"x IN (SELECT y ...)"处理方式完全同表达式"x = y"一样,形如"x IN (y, z, ...)"的表达式,排列顺序完全同X的排列顺序一样。

作为 SELECT语句的一个部分,ORDER BY子句中排序条件也可以通过使用COLLATE运算符设定排列顺序,如果设定了排序时就要按照设定的排序函数进行排序。否则,如果ORDER BY子句使用的排序表达式是一个列,那么该列的排列顺序就用于判定排列顺序。如果该排序表达式不是列并且也无COLLATE子句,就会使用BINARY排列顺序。

6.2 整理序列示例

下面的示例将识别整理序列,决定 SQL 语句的文本比较结果。注意,在文本比较时,如果是数字,二进制或Null值,整理序列可能并没有被使用。  

相关文章