SQLite - 数据类型
(2013-04-22 20:29:52)
标签:
sqlite类型转换it |
分类: Mac/IOS那些事 |
二 存储类型与数据类型
存储类和数据类型
每个存放在sqlite数据库中(或者由这个数据库引擎操作)的值都有下面中的一个存储类:
l
l
l
l
l
从上可以看出存储类比数据类型更一般化。比如INTEGER存储类,包括6中不同长度的不同整形数据类型,这在磁盘上造成了差异。但是只要INTEGER值被从磁盘读出进入到内存进行处理,它们被转换成最一般的数据类型(8-字节有符号整形)。
Sqlite v3数据库中的任何列,除了整形主键列,可以用于存储任何一个存储列的值。sql语句中的中所有值,不管它们是嵌入在sql文本中或者是作为参数绑定到一个预编译的sql语句,它们的存储类型都是未定的。在下面描述的情况中,数据库引擎会在查询执行过程中在数值(numeric)存储类型(INTEGER和REAL)和TEXT之间转换值。
布尔类型
Sqlite没有单独的布尔存储类型,它使用INTEGER作为存储类型,0为false,1为true
Sqlite没有另外为存储日期和时间设定一个存储类集,内置的sqlite日期和时间函数能够将日期和时间以TEXT,REAL或INTEGER形式存放
l
l
l
程序可以任意选择这几个存储类型去存储日期和时间,并且能够使用内置的日期和时间函数在这些格式间自由转换
每个sqlite3数据库中的列都被赋予下面类型近似中的一种:
l
l
l
l
l
具有TEXT近似的列可以用NULL,TEXT或者BLOB类型存储数据。如果数值数据被插入到具有TEXT近似的列,在被存储前被转换为文本形式
一个有NUMERIC近似的列可以使用1中的所有5中存储类来存储数据。当文本数据被存放到NUMERIC近似的列中,这个文本的存储类被转换到INTEGER或REAL(根据优先级顺序),如果这个转换是无损的话。对于TEXT和REAL存储类间的转换,如果数据的前15位的被保留的话sqlite就认为这个转换是无损的、可反转的。如果TEXT到INTEGER或REAL的转换不可避免的会造成损失,那么数据将使用TEXT存储类存储。不会企图去转换NULL或BLOB值。
一个字符串可能看起来像浮点数据,有小数点或指数符号,但是只要这个数据可以使用整形存放,NUMERIC近似就会将它转换到整形。比如,字符串
具有INTEGER近似的列和具有NUMERIC近似的列表现相同。它们之间的差别仅处于转换描述上。
具有REAL近似的列和具有NUMERIC近似的列一样,除了它将整形数据转换成浮点型形式。
具有NONE近似的列不会优先选择一个存储列,也不会强制将数据从一个存储类转换到另外一个类。
<1> 如果声明类型包含”INT”字符串,那么这个列被赋予INTEGER近似
<2> 如果这个列的声明类型包含”CHAR”,”CLOB”,或者”TEXT”中的任意一个,
<3> 如果列的声明类型中包含了字符串”BLOB”或者没有为其声明类型,这个列被赋予NONE近似
<4> 其他的情况,列被赋予NUMERIC近似
上面规则额顺序对于决定列的近似很重要。一个列的声明类型为”CHARINT”的话同时会匹配规则<1>和<2>,但是第一个规则占有优先级所以这个列的近似将是INTEGER。
一般转换如下表
来自create table语句或者强转语句的范例类型名 |
产生的近似 |
用于决定近似的规则 |
INT |
INTEGER |
1 |
CHARACTER(20) |
TEXT |
2 |
BLOB |
NONE |
3 |
REAL |
REAL |
4 |
NUMERIC |
NUMERIC |
5 |
二 列类似数据类型自动转换Demo
sqlite> .schema t1
CREATE TABLE t1(
);
sqlite> SELECT typeof(t), typeof(nu), typeof(i), typeof(r), typeof(no) FROM t1;
text|integer|integer|real|text
sqlite> delete from t1;
sqlite> INSERT INTO t1 VALUES(500.0, 500.0, 500.0, 500.0, 500.0);
sqlite> delete from t1;
sqlite> INSERT INTO t1 VALUES(500, 500, 500, 500, 500);
sqlite> SELECT typeof(t), typeof(nu), typeof(i), typeof(r), typeof(no) FROM t1;
text|integer|integer|real|integer
sqlite> delete from t1;
sqlite> INSERT INTO t1 VALUES(x'0500', x'0500', x'0500', x'0500', x'0500');
sqlite> SELECT typeof(t), typeof(nu), typeof(i), typeof(r), typeof(no) FROM t1;
blob|blob|blob|blob|blob
sqlite> delete from t1;
sqlite> INSERT INTO t1 VALUES(NULL,NULL,NULL,NULL,NULL);
sqlite> SELECT typeof(t), typeof(nu), typeof(i), typeof(r), typeof(no) FROM t1;
null|null|null|null|null
sqlite>