你的位置:首页 > 软件开发 > 操作系统 > Sqlite3中存储类型和数据类型结合文档解析。

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

发布时间:2015-08-05 18:00:04
sqlite3是个很小的数据库,运行在手机,机顶盒上....那它就不可能像musql,sqlserver那么规范,有很多的数据类型,之前我也以为它定义了很多数据类型,其实不是他就5个存储类,那么多数据类型是根据一整套严谨的规则映射的!!还有什么char,varchar其实都是没有 ...

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

sqlite官网:http://www.sqlite.org/

Sqlite3数据类型

大多数的数据库引擎(到现在据我们所知的除了sqlite的每个sql数据库引擎)都使用静态的、刚性的类型,使用静态类型,数据的类型就由它的容器决定,这个容器是这个指被存放的特定列。 从上可以看出存储类比数据类型更一般化。比如INTEGER存储类,包括6中不同长度的不同整形数据类型,这在磁盘上造成了差异。但是只要INTEGER值被从磁盘读出进入到内存进行处理,它们被转换成最一般的数据类型(8-字节有符号整形)。 Sqlite v3数据库中的任何列,除了整形主键列,可以用于存储任何一个存储类型的值。

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

 

1.1布尔类型 

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

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

为了使sqlite和其他数据库间的兼容性最大化,sqlite支持列上“类型近似”的观点,列的类型近似指的是存储在列上数据的推荐类型。这里必须记住一点,这个类型是被推荐,而不是必须的。任何列仍然能存储任意类型的数据。只是一些列,给予选择的话,将会相比于其他的一些类型优选选择一些存储类型,这个列优先选择的存储类型被称为它的“近似”。 具有TEXT近似的列可以用NULL,TEXT或者BLOB类型存储数据。如果数值数据**入到具有TEXT近似的列,在被存储前被转换为文本形式 一个字符串可能看起来像浮点数据,有小数点或指数符号,但是只要这个数据可以使用整形存放,NUMERIC近似就会将它转换到整形。比如,字符串 '3.0e+5'存放到一个具有NUMERIC近似的列中,被存为300000,而不是浮点型值300000.0。 列的近似由这个列的声明类型所决定,根据下面的规则: 1) 如果声明类型包含”INT”字符串,那么这个列被赋予INTEGER近似  2)如果这个列的声明类型包含”CHAR”,”CLOB”,或者”TEXT”中的任意一个,那么这个列就有了TEXT近似。注意类型VARCHAR包含了”CHAR”字符串,那么也就被赋予了TEXT近似  3) 如果列的声明类型中包含了字符串”BLOB”或者没有为其声明类型,这个列被赋予BLOB近似  4)如果列的声明类型包含 “REAL”,”FLOA”,”DOUB”中任何一个,那么这个列就是REAL近似。

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

Example Typenames From The(从上面可以看出,sqlite3只是从声明类型字符串中去查找它知道的声明类型,比如”XINT”将被赋予INTEGER近似因为这个字符串里面有”INT”,所以这里并不需要一个单独的正确的声明类型,而是只要声明类型字符串里面包含了sqlite所知道的声明类型即可)        Sqlite v3有一系列有用的比较操作符,包括 "=", "==", "<","<=", ">", ">=", "!=","<>", "IN", "NOT IN", "BETWEEN","IS", 和"IS NOT" 3.1 排序 比较操作的结果基于操作数的存储类型,根据下面的规则: l  存储类型为NULL的值被认为小于其他任何的值(包括另一个存储类型为NULL的值) l  一个INTEGER或REAL值小于任何TEXT或BLOB值。当一个INTEGER或REAL值与另外一个INTEGER或REAL值比较的话,就执行数值比较 l  TEXT值小于BLOB值。当两个TEXT值比较的时候,就根据序列的比较来决定结果 l  当两个BLOB值比较的时候,使用memcmp()来决定结果 简单的说:BLOB > TEXT > INTEGER/REAL > NULL3.2 比较操作数的近似(Affinity)         Sqlite可能在执行一个比较之前会在INTEGER,REAL或TEXT之间转换比较值。是否在比较操作之前发生转换基于操作数的近似(类型)。

注意每一个表的列都有近似列,但表达式不一定有。l  一个”CAST(expr as type)”形式的表达式与用声明类型为”type”的列有相同的affinity l  其他的情况,一个表达式为NONE affinity 3.3 类型转换之前的比较 l  如果一个操作数有TEXT近似,另一个有没有近似,那么TEXT近似被应用到另一个操作数 l  其他的情况,不应用近似,两个操作数按本来的样子比较 表达式"aBETWEEN b AND c"表示两个单独的二值比较” a >= b AND a <= c”,即使在两个比较中不同的近似被应用到’a’。 

3.4比较例子

CREATE TABLE t1(  a TEXT,   -- text affinity  b NUMERIC,  -- numeric affinity  c BLOB,   -- no affinity  d      -- no affinity);-- Values will be stored as TEXT, INTEGER, TEXT, and INTEGER respectivelyINSERT INTO t1 VALUES('500', '500', '500', 500);SELECT typeof(a), typeof(b), typeof(c), typeof(d) FROM t1;text|integer|text|integer-- Because column "a" has text affinity, numeric values on the-- right-hand side of the comparisons are converted to text before-- the comparison occurs.SELECT a < 40,  a < 60,  a < 600 FROM t1;0|1|1-- Text affinity is applied to the right-hand operands but since-- they are already TEXT this is a no-op; no conversions occur.SELECT a < '40', a < '60', a < '600' FROM t1;0|1|1-- Column "b" has numeric affinity and so numeric affinity is applied-- to the operands on the right. Since the operands are already numeric,-- the application of affinity is a no-op; no conversions occur. All-- values are compared numerically.SELECT b < 40,  b < 60,  b < 600 FROM t1;0|0|1-- Numeric affinity is applied to operands on the right, converting them-- from text to integers. Then a numeric comparison occurs.SELECT b < '40', b < '60', b < '600' FROM t1;0|0|1-- No affinity conversions occur. Right-hand side values all have-- storage class INTEGER which are always less than the TEXT values-- on the left.SELECT c < 40,  c < 60,  c < 600 FROM t1;0|0|0-- No affinity conversions occur. Values are compared as TEXT.SELECT c < '40', c < '60', c < '600' FROM t1;0|1|1-- No affinity conversions occur. Right-hand side values all have-- storage class INTEGER which compare numerically with the INTEGER-- values on the left.SELECT d < 40,  d < 60,  d < 600 FROM t1;0|0|1-- No affinity conversions occur. INTEGER values on the left are-- always less than TEXT values on the right.SELECT d < '40', d < '60', d < '600' FROM t1;1|1|1

 

海外公司注册、海外银行开户、跨境平台代入驻、VAT、EPR等知识和在线办理:https://www.xlkjsw.com

原标题:Sqlite3中存储类型和数据类型结合文档解析。

关键词:sql

sql
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。