(转)SQLite入门之数据类型

原文连接:http://www.seayee.net/article/info_31.html

 

最近在开发一个可以记录日志的程序,要求效率高,需要能做简单的查询和统计。经过同事介绍,看上了SQLite。首先了解一下SQLite存储的数据类型,至于SQLite的发展和工作原理,可以查看SQLite的官方网站(www.sqlite.org),网上的相关文章都挺多挺详细的。

一、SQLite简介

SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows、Linux、Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的处理速度比他们都快。

二、SQLite数据类型

SQLite除了在字段类型为“Integer Primary Key”时是限制数据类型外,其它情况下SQLite是Typelessness(无类型)的。这意味着你可以保存任何类型的数据到你所想要保存的任何表的任何列中,无论这列声明的数据类型是什么。

一般数据采用的固定的静态数据类型,而SQLite采用的是动态数据类型,会根据存入值自动判断。SQLite具有以下五种数据类型:

NULL  空值。
INTEGER  带符号的整型,具体取决有存入数字的范围大小。
REAL  浮点数字,存储为8-byte IEEE浮点数。
TEXT  字符串文本。
BLOB  二进制对象。

但实际上,SQLite 3也接受如下的数据类型:

smallint  16位元的整数。
interger  32位元的整数。
decimal(p,s)  p精确值和s大小的十进位整数,精确值p是指全部有几个数(digits)大小值,s是指小数点後有几位数。如果没有特别指定,则系统会设为p=5;s=0。
float  32位元的实数。
double  64位元的实数。
char(n)  n长度的字串,n不能超过254。
varchar(n)  长度不固定且其最大长度为n的字串,n不能超过4000。
graphic(n)  和char(n)一样,不过其单位是两个字元double-bytes,n不能超过127。这个形态是为了支援两个字元长度的字体,例如中文字。
vargraphic(n)  可变长度且其最大长度为n的双字元字串,n不能超过2000。
date  包含了:年份、月份、日期。
time  包含了:小时、分钟、秒。
timestamp  包含了:年、月、日、时、分、秒、千分之一秒。
datetime  包含日期时间格式,必须写成“2011-05-23”不能写为“2011-5-23”,否则在读取时会产生错误!

对于SQLite来说对字段不指定类型是完全有效的,如:

1
Create Table ex3(a, b, c);

即使SQLite允许忽略数据类型,但是仍然建议在你的Create Table语句中指定数据类型。因为数据类型对于你和其他的程序员交流,或者你准备换掉你的数据库引擎是非常有用的。SQLite支持常见的数据类型,如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
CREATE TABLE ex2(
a VARCHAR(10),
b NVARCHAR(15),
c TEXT,
d INTEGER,
e FLOAT,
f BOOLEAN,
g CLOB,
h BLOB,
i TIMESTAMP,
j NUMERIC(10,5),
k VARYING CHARACTER (24),
l NATIONAL VARYING CHARACTER(16)
);

三、SQLite的类型亲和性分析

(以下引用“上善若水”的分析,仅供学习参考。网址:http://www.cnblogs.com/hustssrs/archive/2009/03/03/1402214.html。)

SQLite不强制数据类型约束。任何数据都可以插入任何列。你可以向一个整型列中插入任意长度的字符串,向布尔型列中插入浮点数,或者向字符型列中插入日期型值。在Create TABLE中所指定的数据类型不会限制在该列中插入任何数据。任何列均可接受任意长度的字符串(只有一种情况除外:标志为INTEGER PRIMARY KEY的列只能存储64位整数,当向这种列中插数据除整数以外的数据时,将会产生错误。)但SQLite确实使用声明的列类型来指示你所期望的格式。所以,例如你向一个整型列中插入字符串时,SQLite会试图将该字符串转换成一个整数。如果可以转换,它将插入该整数;否则,将插入字符串。这是一个特性,而不是一个Bug。这种特性被称为类型或列亲和性(Type or Column Affinity)。

1、类型亲和性优点:

    1)、提高和其它DBMS的兼容性,让用户就像是在用一般的DBMS一样而使用它,提高了容错能力。

    2)、SQLite支持的数据类型只有五种,而其它的大型DBMS支持的数据类型有几十种,那么如果要将其它的数据转换成SQLite下的数据就根本不能实现,所以就将它的数据类型设计为亲和性的,数据类型种类少了系统实现会简单很多,整个系统也就不会太庞大,因为如果有太多的数据类型限制的话,本身系统在实现方面也会困难些。然而,虽然它支持的类型虽然只有五种,可是实际上任何类型都支持了,这就是SQLite数据类型亲和性的巧妙之处。由此我个人认为这也就是将数据类型设计成为亲和性的初衷。

    3)、在插入数据的时候只要做一些检查和转换即可,实现容易。

2、类型亲和性缺点:

    1)、在对表中数据进行统计方面如果有不一致的数据存在则运算比较混乱,其实也就是放宽政策为的是让更多人去维护。不过它自己是有处理方法的,如果在运算时出现不同类型的数据时就忽略不计等。

    2)、还有在数据比较方面也存在同样的问题,不过也有相应的补救措施,规定了比较准则:

        a)、 一个具有空存储类型的值被认为小于任何值(包括另外一个具有空存储类型的值)。

        b)、一个整数值或实数值小于任何文本值和BLOB值。当一个整数或实数和另一个整数或实数相比较的时候,则按照实际数值来比较。

        c)、一个文本值小于BLOB值。当两个文本值相比较的时候,则用C语言类库中的memcmp()函数来比较。然而,有时候也不是这样的,比如在下面所描述的“用户定义的整理顺序”情况下。

        d)、当两个BLOB文本被比较的时候,结果决定于memcmp()函数。

posted @ 2012-09-19 17:14  loverszhaokai  阅读(229)  评论(0编辑  收藏  举报