关闭

SQLite学习

620人阅读 评论(0) 收藏 举报
分类:

sqlite几个特性

1、 创建数据
如果不往数据库里面添加任何的表,这个数据库等于没有建立,不会在硬盘上产生任何文件,如果数据库已经存在,则会打开这个数据库。 


2、 如何通过sqlite3.dll与sqlite3.def生成sqlite3.lib文件
LIB /DEF:sqlite3.def /machine:IX86


3、 sqlite3_open打开一个数据库时,如果数据库不存在就会新生成一个数据库文件。如果接着执行其他查询语句就会失败,比如sqlite3_prepare,编程中出现明明指定了数据库而且里面也有数据,为什么查询失败了,主要是数据库名路径不对引起的。一般的做法是先检查数据库文件是否存在,如果存在就使用sqlite3_open打开数据库;否则创建一个新的数据库。


4、 如何建立自动增长字段
声明为INTEGER PRIMARY KEY的列将会自动增长。


5、SQLite3支持何种数据类型?
NULL
INTEGER
REAL
TEXT
BLOB
但实际上,sqlite3也接受如下的数据类型:
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包含了年、月、日、时、分、秒、千分之一秒。


6、SQLite允许向一个integer型字段中插入字符串
这是一个特性,而不是一个bug。SQLite不强制数据类型约束。任何数据都可以插入任何列。你可以向一个整型列中插入任意长度的字符串,向布尔型列中插入浮点数,或者向字符型列中插入日期型值。在CREATE TABLE中所指定的数据类型不会限制在该列中插入任何数据。任何列均可接受任意长度的字符串(只有一种情况除外:标志为INTEGER PRIMARY KEY的列只能存储64位整数,当向这种列中插数据除整数以外的数据时,将会产生错误。


但SQLite确实使用声明的列类型来指示你所期望的格式。所以,例如你向一个整型列中插入字符串时,SQLite会试图将该字符串转换成一个整数。如果可以转换,它将插入该整数;否则,将插入字符串。这种特性有时被称为类型或列亲和性(type or column affinity).


7、为什么SQLite不允许在同一个表不同的两行上使用0和0.0作主键?
主键必须是数值类型,将主键改为TEXT型将不起作用。
每一行必须有一个唯一的主键。对于一个数值型列,SQLite认为'0'和'0.0'是相同的,因为他们在作为整数比较时是相等的(参见上一问题)。所以,这样值就不唯一了。


8、多个应用程序或一个应用程序的多个实例可以同时访问同一个数据库文件吗?
 
多个进程可同时打开同一个数据库。多个进程可以同时进行SELECT操作,但在任一时刻,只能有一个进程对数据库进行更改。
 
SQLite使用读、写锁控制对数据库的访问。(在Win95/98/ME等不支持读、写锁的系统下,使用一个概率性的模拟来代替。)但使用时要注意:如果数据库文件存放于一个NFS文件系统上,这种锁机制可能不能正常工作。这是因为fcntl()文件锁在很多NFS上没有正确的实现。在可能有多个进程同时访问数据库的时候,应该避免将数据库文件放到NFS上。在Windows上,Microsoft的文档中说:如果使用FAT文件系统而没有运行share.exe守护进程,那么锁可能是不能正常使用的。那些在Windows上有很多经验的人告诉我:对于网络文件,文件锁的实现有好多Bug,是靠不住的。如果他们说的是对的,那么在两台或多台Windows机器间共享数据库可能会引起不期望的问题。


我们意识到,没有其它嵌入式的SQL数据库引擎能象SQLite这样处理如此多的并发。SQLite允许多个进程同时打开一个数据库,同时读一个数据库。当有任何进程想要写时,它必须在更新过程中锁住数据库文件。但那通常只是几毫秒的时间。其它进程只需等待写进程干完活结束。典型地,其它嵌入式的SQL数据库引擎同时只允许一个进程连接到数据库。


但是,Client/Server数据库引擎(如PostgreSQL, MySQL,或Oracle)通常支持更高级别的并发,并且允许多个进程同时写同一个数据库。这种机制在Client/Server结构的数据库上是可能的,因为总是有一个单一的服务器进程很好地控制、协调对数据库的访问。如果你的应用程序需要很多的并发,那么你应该考虑使用一个Client/Server结构的数据库。但经验表明,很多应用程序需要的并发,往往比其设计者所想象的少得多。


当SQLite试图访问一个被其它进程锁住的文件时,缺省的行为是返回SQLITE_BUSY。可以在C代码中使用sqlite3_busy_handler()或sqlite3_busy_timeout() API函数调整这一行为。


9、SQLite线程安全吗?
线程是魔鬼(Threads are evil)。避免使用它们。
SQLite是线程安全的。由于很多用户会忽略我们在上一段中给出的建议,我们做出了这种让步。但是,为了达到线程安全,SQLite在编译时必须将SQLITE_THREADSAFE预处理宏置为1。在Windows和Linux上,已编译的好的二进制发行版中都是这样设置的。如果不确定你所使用的库是否是线程安全的,可以调用sqlite3_threadsafe()接口找出。


10、在SQLite数据库中如何列出所有的表和索引?
如果你运行sqlite3命令行来访问你的数据库,可以键入“.tables”来获得所有表的列表。或者,你可以输入“.schema”来看整个数据库模式,包括所有的表的索引。输入这些命令,后面跟一个LIKE模式匹配可以限制显示的表。


11、SQLite数据库有已知的大小限制吗?
在Windows和Unix下,版本2.7.4的SQLite可以达到2的41次方字节(2T字节)。老版本的为2的31次方字节(2G字节)。
SQLite版本2.8限制一个记录的容量为1M。SQLite版本3.0则对单个记录容量没有限制。
表名、索引表名、视图名、触发器名和字段名没有长度限制。但SQL函数的名称(由sqlite3_create_function() API函数创建)不得超过255个字符。


12、在SQLite中,VARCHAR字段最长是多少?
SQLite不强制VARCHAR的长度。你可以在SQLITE中声明一个VARCHAR(10),SQLite还是可以很高兴地允许你放入500个字符。并且这500个字符是原封不动的,它永远不会被截断。
 
13、在SQLite中,如何在一个表上添加或删除一列?
SQLite有有限地ALTER TABLE支持。你可以使用它来在表的末尾增加一列,可更改表的名称。如果需要对表结构做更复杂的改变,则必须重新建表。重建时可以先将已存在的数据放到一个临时表中,删除原表,创建新表,然后将数据从临时表中复制回来。


如,假设有一个t1表,其中有"a", "b", "c"三列,如果要删除列c,以下过程描述如何做:


BEGIN TRANSACTION;
CREATE TEMPORARY TABLE t1_backup(a,b);
INSERT INTO t1_backup SELECT a,b FROM t1;
DROP TABLE t1;
CREATE TABLE t1(a,b);
INSERT INTO t1 SELECT a,b FROM t1_backup;
DROP TABLE t1_backup;
COMMIT;
14、在SQLite中支持分页吗?
 
SQLite分页是世界上最简单的。如果我要去11-20的Account表的数据Select * From Account Limit 9 Offset 10;
以上语句表示从Account表获取数据,跳过10行,取9行。这个特性足够让很多的web中型网站使用这个了。也可以这样写 select * from account limit10,9和上面的的效果一样。这种写法MySQL也支持。


详细出处参考:http://www.jb51.net/article/36927.htm










原文链接:http://www.cnblogs.com/stephen-liu74/archive/2012/01/13/2322027.html

一、聚合函数:

    SQLite中支持的聚合函数在很多其他的关系型数据库中也同样支持,因此我们这里将只是给出每个聚集函数的简要说明,而不在给出更多的示例了。这里还需要进一步说明的是,对于所有聚合函数而言,distinct关键字可以作为函数参数字段的前置属性,以便在进行计算时忽略到所有重复的字段值,如count(distinct x)。

函数 说明
avg(x) 该函数返回在同一组内参数字段的平均值。对于不能转换为数字值的String和BLOB类型的字段值,如'HELLO',SQLite会将其视为0。avg函数的结果总是浮点型,唯一的例外是所有的字段值均为NULL,那样该函数的结果也为NULL。
count(x|*)   count(x)函数返回在同一组内,x字段中值不等于NULL的行数。count(*)函数返回在同一组内的数据行数。
group_concat(x[,y]) 该函数返回一个字符串,该字符串将会连接所有非NULL的x值。该函数的y参数将作为每个x值之间的分隔符,如果在调用时忽略该参数,在连接时将使用缺省分隔符","。再有就是各个字符串之间的连接顺序是不确定的。  
max(x) 该函数返回同一组内的x字段的最大值,如果该字段的所有值均为NULL,该函数也返回NULL。
min(x) 该函数返回同一组内的x字段的最小值,如果该字段的所有值均为NULL,该函数也返回NULL。
sum(x) 该 函数返回同一组内的x字段值的总和,如果字段值均为NULL,该函数也返回NULL。如果所有的x字段值均为整型或者NULL,该函数返回整型值,否则就 返回浮点型数值。最后需要指出的是,如果所有的数据值均为整型,一旦结果超过上限时将会抛出"integer overflow"的异常。
total(x) 该函数不属于标准SQL,其功能和sum基本相同,只是计算结果比sum更为合理。比如当所有字段值均为NULL时,和sum不同的是,该函数返回0.0。再有就是该函数始终返回浮点型数值。该函数始终都不会抛出异常。


二、核心函数:

    以下函数均为SQLite缺省提供的内置函数,其声明和描述见如下列表:

函数 说明
abs(X) 该函数返回数值参数X的绝对值,如果X为NULL,则返回NULL,如果X为不能转换成数值的字符串,则返回0,如果X值超出Integer的上限,则抛出"Integer Overflow"的异常。
changes() 该函数返回最近执行的INSERT、UPDATE和DELETE语句所影响的数据行数。我们也可以通过执行C/C++函数sqlite3_changes()得到相同的结果。
coalesce(X,Y,...)   返回函数参数中第一个非NULL的参数,如果参数都是NULL,则返回NULL。该函数至少2个参数。
ifnull(X,Y) 该函数等同于两个参数的coalesce()函数,即返回第一个不为NULL的函数参数,如果两个均为NULL,则返回NULL。
length(X)   如果参数X为字符串,则返回字符的数量,如果为数值,则返回该参数的字符串表示形式的长度,如果为NULL,则返回NULL。
lower(X) 返回函数参数X的小写形式,缺省情况下,该函数只能应用于ASCII字符。
ltrim(X[,Y])   如果没有可选参数Y,该函数将移除参数X左侧的所有空格符。如果有参数Y,则移除X左侧的任意在Y中出现的字符。最后返回移除后的字符串。
max(X,Y,...) 返回函数参数中的最大值,如果有任何一个参数为NULL,则返回NULL。
min(X,Y,...) 返回函数参数中的最小值,如果有任何一个参数为NULL,则返回NULL。
nullif(X,Y) 如果函数参数相同,返回NULL,否则返回第一个参数。  
random()   返回整型的伪随机数。
replace(X,Y,Z)   将字符串类型的函数参数X中所有子字符串Y替换为字符串Z,最后返回替换后的字符串,源字符串X保持不变。
round(X[,Y]) 返回数值参数X被四舍五入到Y刻度的值,如果参数Y不存在,缺省参数值为0。  
rtrim(X[,Y])   如果没有可选参数Y,该函数将移除参数X右侧的所有空格符。如果有参数Y,则移除X右侧的任意在Y中出现的字符。最后返回移除后的字符串。
substr(X,Y[,Z]) 返回函数参数X的子字符串,从第Y位开始(X中的第一个字符位置为1)截取Z长度的字符,如果忽略Z参数,则取第Y个字符后面的所有字符。如果Z的值为负数,则从第Y位开始,向左截取abs(Z)个字符。如果Y值为负数,则从X字符串的尾部开始计数到第abs(Y)的位置开始。 
total_changes() 该函数返回自从该连接被打开时起,INSERT、UPDATE和DELETE语句总共影响的行数。我们也可以通过C/C++接口函数sqlite3_total_changes()得到相同的结果。
trim(x[,y]) 如果没有可选参数Y,该函数将移除参数X两侧的所有空格符。如果有参数Y,则移除X两侧的任意在Y中出现的字符。最后返回移除后的字符串。 
upper(X) 返回函数参数X的大写形式,缺省情况下,该函数只能应用于ASCII字符。
typeof(X) 返回函数参数数据类型的字符串表示形式,如"Integer、text、real、null"等。


三、日期和时间函数:

    SQLite主要支持以下四种与日期和时间相关的函数,如:
    1). date(timestring, modifier, modifier, ...)
    2). time(timestring, modifier, modifier, ...)
    3). datetime(timestring, modifier, modifier, ...)
    4). strftime(format, timestring, modifier, modifier, ...)
    以上所有四个函数都接受一个时间字符串作为参数,其后再跟有0个或多个修改符。其中strftime()函数还接受一个格式字符串作为其第一个参数。strftime()和C运行时库中的同名函数完全相同。至于其他三个函数,date函数的缺省格式为:"YYYY-MM-DD",time函数的缺省格式为:"HH:MM:SS",datetime函数的缺省格式为:"YYYY-MM-DD HH:MM:SS"。    
   1. strftime函数的格式信息:

格式 说明
%d day of month: 00
%f fractional seconds: SS.SSS
%H hour: 00-24
%j day of year: 001-366
%J Julian day number
%m month: 01-12
%M minute: 00-59
%s seconds since 1970-01-01
%S seconds: 00-59
%w day of week 0-6 with Sunday==0
%W week of year: 00-53
%Y year: 0000-9999
%% %

    需要额外指出的是,其余三个时间函数均可用strftime来表示,如:
    date(...)         strftime('%Y-%m-%d', ...)
    time(...)         strftime('%H:%M:%S', ...)
    datetime(...)   strftime('%Y-%m-%d %H:%M:%S', ...) 
    
    2. 时间字符串的格式:
    见如下列表:
    1). YYYY-MM-DD
    2). YYYY-MM-DD HH:MM
    3). YYYY-MM-DD HH:MM:SS
    4). YYYY-MM-DD HH:MM:SS.SSS
    5). HH:MM
    6). HH:MM:SS
    7). HH:MM:SS.SSS
    8). now
    5)7)中只是包含了时间部分,SQLite将假设日期为2000-01-018)表示当前时间。
    
   3. 修改符:
    见如下列表:
    1). NNN days
    2). NNN hours
    3). NNN minutes
    4). NNN.NNNN seconds
    5). NNN months
    6). NNN years
    7). start of month
    8). start of year
    9). start of day
    10).weekday N     
    1)6)将只是简单的加减指定数量的日期或时间值,如果NNN的值为负数,则减,否则加。7)9)则将时间串中的指定日期部分设置到当前月、年或日的开始。10)则将日期前进到下一个星期N,其中星期日为0。注:修改符的顺序极为重要,SQLite将会按照从左到右的顺序依次执行修改符。
  
    4. 示例:
    --返回当前日期。
    sqlite> SELECT date('now');  
    2012-01-15    
    --返回当前月的最后一天。
    sqlite> SELECT date('now','start of month','1 month','-1 day');
    2012-01-31
    --返回从1970-01-01 00:00:00到当前时间所流经的秒数。
    sqlite> SELECT strftime('%s','now');
    1326641166    
    --返回当前年中10月份的第一个星期二是日期。
    sqlite> SELECT date('now','start of year','+9 months','weekday 2');
    2012-10-02   


  关于 sqlite字段属性


还有就是注意下与其他数据库的字段类型差异

一、存储种类和数据类型:

    SQLite将数据值的存储划分为以下几种存储类型:
     NULL: 表示该值为NULL值。
     INTEGER: 无符号整型值。
     REAL: 浮点值。
     TEXT: 文本字符串,存储使用的编码方式为UTF-8、UTF-16BE、UTF-16LE。
     BLOB: 存储Blob数据,该类型数据和输入数据完全相同。
    由于SQLite采用的是动态数据类型,而其他传统的关系型数据库使用的是静态数据类型,即字段可以存储的数据类型是在表声明时即以确定的,因此它们之间 在数据存储方面还是存在着很大的差异。在SQLite中,存储分类和数据类型也有一定的差别,如INTEGER存储类别可以包含6种不同长度的 Integer数据类型,然而这些INTEGER数据一旦被读入到内存后,SQLite会将其全部视为占用8个字节无符号整型。因此对于SQLite而 言,即使在表声明中明确了字段类型,我们仍然可以在该字段中存储其它类型的数据。然而需要特别说明的是,尽管SQLite为我们提供了这种方便,但是一旦 考虑到数据库平台的可移植性问题,我们在实际的开发中还是应该尽可能的保证数据类型的存储和声明的一致性。除非你有极为充分的理由,同时又不再考虑数据库 平台的移植问题,在此种情况下确实可以使用SQLite提供的此种特征。
   1. 布尔数据类型:
    SQLite并没有提供专门的布尔存储类型,取而代之的是存储整型1表示true,0表示false。

   2. 日期和时间数据类型:
    和布尔类型一样,SQLite也同样没有提供专门的日期时间存储类型,而是以TEXT、REAL和INTEGER类型分别不同的格式表示该类型,如:
    TEXT: "YYYY-MM-DD HH:MM:SS.SSS"
    REAL: 以Julian日期格式存储
    INTEGER: 以Unix时间形式保存数据值,即从1970-01-01 00:00:00到当前时间所流经的秒数。

二、类型亲缘性:

    为了最大化SQLite和其它数据库引擎之间的数据类型兼容性,SQLite提出了"类型亲缘性(Type Affinity)"的概念。我们可以这样理解"类型亲缘性 ",在表字段被声明之后,SQLite都会根据该字段声明时的类型为其选择一种亲缘类型,当数据插入时,该字段的数据将会优先采用亲缘类型作为该值的存储 方式,除非亲缘类型不匹配或无法转换当前数据到该亲缘类型,这样SQLite才会考虑其它更适合该值的类型存储该值。SQLite目前的版本支持以下五种 亲缘类型:

亲缘类型 描述  
TEXT 数值型数据在被插入之前,需要先被转换为文本格式,之后再插入到目标字段中。
NUMERIC 当文本数据被插入到亲缘性为NUMERIC的 字段中时,如果转换操作不会导致数据信息丢失以及完全可逆,那么SQLite就会将该文本数据转换为INTEGER或REAL类型的数据,如果转换失 败,SQLite仍会以TEXT方式存储该数据。对于NULL或BLOB类型的新数据,SQLite将不做任何转换,直接以NULL或BLOB的方式存储 该数据。需要额外说明的是,对于浮点格式的常量文本,如"30000.0",如果该值可以转换为INTEGER同时又不会丢失数值信息,那么SQLite 就会将其转换为INTEGER的存储方式。
INTEGER 对于亲缘类型为INTEGER的字段,其规则等同于NUMERIC,唯一差别是在执行CAST表达式时。
REAL 其规则基本等同于NUMERIC,唯一的差别是不会将"30000.0"这样的文本数据转换为INTEGER存储方式。
NONE 不做任何的转换,直接以该数据所属的数据类型进行存储。  

   1. 决定字段亲缘性的规则:
    字段的亲缘性是根据该字段在声明时被定义的类型来决定的,具体的规则可以参照以下列表。需要注意的是以下列表的顺序,即如果某一字段类型同时符合两种亲缘性,那么排在前面的规则将先产生作用。
    1). 如果类型字符串中包含"INT",那么该字段的亲缘类型是INTEGER。
    2). 如果类型字符串中包含"CHAR"、"CLOB"或"TEXT",那么该字段的亲缘类型是TEXT,如VARCHAR。
    3). 如果类型字符串中包含"BLOB",那么该字段的亲缘类型是NONE。
    4). 如果类型字符串中包含"REAL"、"FLOA"或"DOUB",那么该字段的亲缘类型是REAL。
    5). 其余情况下,字段的亲缘类型为NUMERIC。

    2. 具体示例:

声明类型 亲缘类型 应用规则
INT
INTEGER
TINYINT
SMALLINT
MEDIUMINT
BIGINT
UNSIGNED BIG INT
INT2
INT8
INTEGER 1
CHARACTER(20)
VARCHAR(255)
VARYING CHARACTER(255)
NCHAR(55)
NATIVE CHARACTER(70)
NVARCHAR(100)
TEXT
CLOB
TEXT 2
BLOB NONE 3
REAL
DOUBLE
DOUBLE PRECISION
FLOAT
REAL 4
NUMERIC
DECIMAL(10,5)
BOOLEAN
DATE
DATETIME
NUMERIC 5

    注:在SQLite中,类型VARCHAR(255)的长度信息255没有任何实际意义,仅仅是为了保证与其它数据库的声明一致性。

三、比较表达式:

    在SQLite3中支持的比较表达式有:"=", "==", "<", "<=", ">", ">=", "!=", "<>", "IN", "NOT IN", "BETWEEN", "IS" and "IS NOT"。
    数据的比较结果主要依赖于操作数的存储方式,其规则为:
    1). 存储方式为NULL的数值小于其它存储类型的值。
    2). 存储方式为INTEGER和REAL的数值小于TEXT或BLOB类型的值,如果同为INTEGER或REAL,则基于数值规则进行比较。
    3). 存储方式为TEXT的数值小于BLOB类型的值,如果同为TEXT,则基于文本规则(ASCII值)进行比较。
    4). 如果是两个BLOB类型的数值进行比较,其结果为C运行时函数memcmp()的结果。

四、操作符:

    所有的数学操作符(+, -, *, /, %, <<, >>, &, and |)在执行之前都会先将操作数转换为NUMERIC存储类型,即使在转换过程中可能会造成数据信息的丢失。此外,如果其中一个操作数为NULL,那么它们 的结果亦为NULL。在数学操作符中,如果其中一个操作数看上去并不像数值类型,那么它们结果为0或0.0。

-------

上面的这一小段来自:http://www.cnblogs.com/stephen-liu74/archive/2012/02/22/2325258.html,其实这里也有一份,不过这一份嘛 ,就整理的不太好了。所以我扔到code框里。。其实以前有一份pdf的,但一下子找不到了。而且。。。mac下看chm和pdf都不太爽。。

http://www.21andy.com/blog/20091211/1489.html
  1. NULL  
  2. INTEGER  
  3. REAL  
  4. TEXT  
  5. BLOB  
  6. 但实际上,sqlite3也接受如下的数据类型:  
  7. smallint 16 位元的整数。  
  8. interger 32 位元的整数。  
  9. decimal(p,s) p 精确值和 s 大小的十进位整数,精确值p是指全部有几个数(digits)大小值,s是指小数点後有几位数。如果没有特别指定,则系统会设为 p=5s=0 。  
  10. float   32位元的实数。  
  11. double   64位元的实数。  
  12. char(n)   n 长度的字串,n不能超过 254。  
  13. varchar(n) 长度不固定且其最大长度为 n 的字串,n不能超过 4000。  
  14. graphic(n) 和 char(n) 一样,不过其单位是两个字元 double-bytes, n不能超过127。这个形态是为了支援两个字元长度的字体,例如中文字。  
  15. vargraphic(n) 可变长度且其最大长度为 n 的双字元字串,n不能超过 2000  
  16. date   包含了 年份、月份、日期。  
  17. time   包含了 小时、分钟、秒。  
  18. timestamp 包含了 年、月、日、时、分、秒、千分之一秒。  
  19.   
  20.    
  21.   
  22. 1.存储类别  
  23. 第二版把所有列的值都存储成ASCII文本格式。第三版则可以把数据存储成整数和实数,还可以存储BLOB数据.  
  24.   
  25. Each value stored in an SQLite数据库中存储的每个值都有一个属性,都属于下面所列类中的一种,(被数据库引擎所控制)  
  26.   
  27. 空.这个值为空值  
  28.   
  29. 整数.值被标识为整数,依据值的大小可以依次被存储为1,2,3,4,5,6,7,8.  
  30.   
  31. 实数. 所有值都是浮动的数值,被存储为8字节的IEEE浮动标记序号.  
  32.   
  33. 文本. 值为文本字符串,使用数据库编码存储(TUTF-8, UTF-16BE or UTF-16-LE).  
  34.   
  35. BLOB. 值是BLOB数据,如何输入就如何存储,不改变格式.  
  36.   
  37. 像SQLite2.0版一样,在3.0版中,除了INTEGER PRIMARY KEY,数据库中的任何列都可以存储任何类型的数据.这一规则也有例外,在下面的"严格相似模式"中将描述.  
  38.   
  39. 输入SQLite的所有值,不管它是嵌入 SQL语句中的文字还是提前编译好的绑定在SQL语句中的值,在SQL语句执行前都被存储为一个类.在下面所描述的情况下,数据库引擎将在执行时检查并把值在数字存储类(整数和实数)和文本类间转换.  
  40.   
  41. 存储的类别最初被分类为如下:  
  42.   
  43. 具体的值比如SQL语句部分的带双引号或单引号的文字被定义为文本,如果文字没带引号并没有小数点或指数则被定义为整数,如果文字没带引号但有小数点或指数则被定义为实数,如果值是空则被定义为空值.BLOB数据使用符号X'ABCD'来标识.  
  44.   
  45. Values supplied using the 被输入的值使用sqlite3_bind_* APIs的被分类一个存储等级,这等级是和原来的类基本相一致的. (比如sqlite3_bind_blob()绑定一个BLOB的值).  
  46.   
  47. 值的分类是SQL分等级操作的结果,决定于最远的操作表达式.用户定义的功能也许会把值返回任意的类.在编译的时候来确定表达式的存储类基本是不可能的.  
  48.   
  49. 2. 列之间的亲和性  
  50. 在SQLite3.0版中,值被定义为什么类型只和值自身有关,和列没有关系,和变量也没有关系. (这有时被称作 弱类型.)所有其它的我们所使用的数据库引擎都受静态类型系统的限制,其中的所有值的类是由其所属列的属性决定的,而和值无关.  
  51.   
  52. 为了最大限度的增加SQLite数据库和其他数据库的兼容性,SQLite支持列的"类型亲和性". 列的亲和性是为该列所存储的数据建议一个类型.我们要注意是建议而不是强迫.在理论上来讲,任何列依然是可以存储任何类型的数据的. 只是针对某些列,如果给建议类型的话,数据库将按所建议的类型存储.这个被优先使用的数据类型则被称为"亲和类型".  
  53.   
  54. 在SQLite3.0版中,数据库中的每一列都被定义为以下亲和类型中的一种:  
  55.   
  56. 文本  
  57. 数字的  
  58. 整数  
  59. 无  
  60. 一个具有类型亲和性的列按照无类型,文本,或BLOB存储所有的数据.如果数字数据被插入一个具有文本类型亲和性的列,在存储之前数字将被转换成文本.  
  61.   
  62. 一个具有数字类型亲和性的列也许使用所有的五个存储类型存储值.当文本数据被插入一个数字列时,在存储之前,数据库将尝试着把文本转换成整数或实数.如果能成功转换的话,值将按证书活实数的类型被存储. 如果不能 成功转换的话,值则只能按文本类型存储了,而不会被转换成无类型或BLOB类型来存储.  
  63.   
  64. 一个具有整数亲和力的列在转换方面和具有数字亲和力的列是一样的,但也有些区别 ,比如没有浮动量的实值(文本值转换的值)被插入具有整数亲和力的列时,它将被转换成整数并按整数类型存储.  
  65.   
  66. 一个具有无类型亲和力的列不会优先选择使用哪个类型.在数据被输入前它不会强迫数据转换类型.  
  67.   
  68. 2.1 列的亲和性的决定  
  69. 一个列的亲和类型是由该列所宣称的类型决定的.遵守以下规则:  
  70.   
  71. 如果数据类型包括字符串"INT"那么它被定义成具有整数亲和性.  
  72.   
  73. 如果列中的数据类型包括以下任何的字符串 "CHAR", "CLOB", or "TEXT" 那么这个列则具有文本亲和性.要注意VARCHAR类型包括字符串"CHAR"因此也具有文本类型亲和性.  
  74.   
  75. 如果一个列的数据类型包括字符串"BLOB"或者如果数据类型被具体化了,那么这个列具有无类型亲和性.  
  76.   
  77. 否则就具有数字类型亲和性.  
  78.   
  79. 如果表格使用If "CREATE TABLE AS SELECT..."语句生成的,那么所有的列则都没有具体的数据类型,则没有类型亲和性.  
  80.   
  81. 2.2 列的亲和性的例子  
  82. CREATE TABLE t1(  
  83.     t TEXT,  
  84.     nu NUMERIC,  
  85.     i INTEGER,  
  86.     no BLOB  
  87. );  
  88.   
  89. -- Storage classes for the following row:  
  90. -- TEXT, REAL, INTEGER, TEXT  
  91. INSERT INTO t1 VALUES('500.0', '500.0', '500.0', '500.0');  
  92.   
  93. -- Storage classes for the following row:  
  94. -- TEXT, REAL, INTEGER, REAL  
  95. INSERT INTO t1 VALUES(500.0, 500.0, 500.0, 500.0);  
  96.   
  97. 3.比较表达式  
  98. 像SQLite2.0版一样,3.0版的一个特性是二进制比较符'=', '<', '<=', '>=' and '!=',一个操作'IN'可以测试固定的成员资格, 三重的比较操作符'BETWEEN'.  
  99.   
  100. 比较的结果决定于被比较的两个值的存储类型。遵循以下规则:  
  101.   
  102. 一个具有空存储类型的值被认为小于任何值(包括另外一个具有空存储类型的值)。  
  103.   
  104. 一个整数值或实数值小于任何文本值和BLOB值。 当一个整数或实数和另一个整数或实数相比较的时候,则按照实际数值来比较。  
  105.   
  106. 一个文本值小于BLOB值。当两个文本值相比较的时候,则用C语言类库中的memcmp()函数来比较。然而,有时候也不是这样的,比如在下面所描述的“用户定义的整理顺序”情况下。  
  107.   
  108. 当两个BLOB文本被比较的时候,结果决定于memcmp()函数。  
  109.   
  110. 在开始比较前,SQLite尝试着把值在数字存储级(整数和实数)和文本之间相互转换。下面列举了关于如何比较二进制值的例子。在着重号below中使用的表达式可以表示SQL标量表达式或是文本但不是一个列值。  
  111.   
  112. 当一个列值被比拟为表达式结果的时候,在比较开始前,列的亲和性将被应用在表达结果中。  
  113.   
  114. 当两个列值比较的时候,如果一个列有整数或数字亲和性的时候,而另外一列却没有,那么数字亲和性适用于从非数字列提取的任何具有文本存储类型的值. P>  
  115.   
  116. 当比较两个表达式的结果时,不发生任何转换,直接比较结果.如果一个字符串和一个数字比较, 数字总是小于字符串.  
  117.   
  118. 在SQLite中, 表达式"a BETWEEN b AND c"等于表达式 "a >= b AND a <= c",在比较表达式时,a可以是具有任何亲和性.  
  119.   
  120. 表达式 "a IN (SELECT b ....)" 在比较时遵循上面所提到的三条规则,是二进制比较.(例如, 在一个相似的样式 "a = b"). 例如,如果'b'是一个列值, 'a' 是一个表达式,那么,在开始比较前,'b'的亲和性就被转换为'a'的亲和性了.  
  121.   
  122. SQLite把表达式 "a IN (x, y, z)" 和 "a = z OR a = y OR a = z"视为相等.  
  123.   
  124. 3.1 比较例子  
  125. CREATE TABLE t1(  
  126.     a TEXT,  
  127.     b NUMERIC,  
  128.     c BLOB  
  129. );  
  130.   
  131. -- Storage classes for the following row:  
  132. -- TEXT, REAL, TEXT  
  133. INSERT INTO t1 VALUES('500', '500', '500');  
  134.   
  135. -- 60 and 40 are converted to '60' and '40' and values are compared as TEXT.  
  136. SELECT a < 60, a < 40 FROM t1;  
  137. 1|0  
  138.   
  139. -- Comparisons are numeric. No conversions are required.  
  140. SELECT b < 60, b < 600 FROM t1;  
  141. 0|1  
  142.   
  143. -- Both 60 and 600 (storage class NUMERIC) are less than '500'  
  144. -- (storage class TEXT).  
  145. SELECT c < 60, c < 600 FROM t1;  
  146. 0|0  
  147.   
  148. 4. 运算符  
  149. 所有的数学运算符(所有的运算符而不是连锁作用标记符"||")运算对象首先具有数字亲和性, 如果一个或是两个都不能被转换为数字那么操作的结果将是空值。  
  150.   
  151. 对于连接作用操作符,所有操作符将首先具有文本亲和性。如果其中任何一个操作符不能被转换为文本(因为它是空值或是BLOB)连接作用操作符将是空值。  
  152.   
  153. 5. 分类,排序,混合挑选  
  154. 当用子句ORDER挑选值时,空值首先被挑选出来, 然后是整数和实数按顺序被挑选出来, 然后是文本值按memcmp()顺序被挑选出来, 最后是BLOB值按memcmp()顺序被挑选出来.在挑选之前, 没有存储类型的值都被转换了.  
  155.   
  156. When grouping values with the 当用GROUP BY子句给值分组时,具有不同存储类型的值被认为是不同的, 但也有例外, 比如,一个整数值和一个实数值从数字角度来说是相等的,那么它们则是相等的.用GROUP by 子句比较完后,值不具有任何亲和性.  
  157.   
  158. 混合挑选操作符UNION, INTERSECT and EXCEPT 在值之间实行绝对的比较,同样的亲和性将被应用于所有的值,这些值将被存储在一个单独的具有混合SELECT的结果组的列中. 被赋予的亲和性是该列的亲和性,这个亲和性是由剩下的大部分的混合SELECTS返回的,这些混合SELECTS在那个位置上有列值(而不是其它类型的表达式). 如果一个给定的混合SELECT列没有SELECTS的量, 那么在比较前,该列的值将不具有任何亲和性.  
  159.   
  160. 6. 其它亲和性模式  
  161. 以上的部分所描述的都是数据库引擎在正常亲和性模式下所进行的操作, SQLite将描述其它两种亲和性模式,如下:  
  162.   
  163. 严格亲和性模式.在这种模式下,如果需要值之间相互转换数据存储类型的话,数据库引擎将发送错误报告,当前语句也将会重新运行.  
  164.   
  165. 无亲和性模式.在这种模式下,值的数据存储类型不发生转换.具有不同存储类型的值之间不能比较,但整数和实数之间可以比较.  
  166.   
  167. 7.用户定义的校对顺序  
  168. By default, when 当SQLite比较两个文本值的时候,通过系统设定,不管字符串的编码是什么,用memcmp()来比较. SQLite第三版允许用户提供任意的函数来代替memcmp(),也就是用户定义的比较顺序.  
  169.   
  170. 除了系统预设的BINARY比较顺序,它是用memcmp()函数比较,SQLite还包含了两个额外的内置比较顺序函数, NOCASE和REVERSE:  
  171.   
  172. BINARY -使用memcmp()比较字符串数据, 不考虑文本编码.  
  173. REVERSE -用倒序比较二进制文本.  
  174. NOCASE - 和二进制一样,但在比较之前,26位的大写字母盘要被折合成相应的小写字母盘.  
  175. 7.1 分配比较顺序  
  176. 每个表格中的每个列都有一个预设的比较类型.如果一个比较类型不是二进制所要求的,比较的子句将被具体化为 列的定义 来定义该列.  
  177.   
  178. 当用SQLite比较两个文本值时,比较顺序将按照以下的规则来决定比较的结果.文档的第三部分和第五部分描述在何种场合下发生这种比较.  
  179.   
  180. 对于二进制比较符(=, <><= and >=),如果每个操作数是一列的话,那么该列的默认比较类型决定于所使用的比较顺序. 如果两个操作数都是列的话,那么左边的操作数的比较类型决定了所要使用的比较顺序.如果两个操作数都不是一列,将使用二进制来比较.  
  181.   
  182. 表达式"x BETWEEN y and z"和 "x >= y AND x <= z"是相同的. 表达式"x IN (SELECT y ...)" 和表达式 "xx = y" 使用同样的方法来操作,这是为了决定所要使用的比较顺序.如果X是一列或者二进制的,则"x IN (y, z ...)" 形式的表达式所使用的比较顺序是X的默认的比较类型.  
  183.   
  184. 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.  
  185.   
  186. 7.2 比较顺序的例子  
  187. 下面的例子介绍了The examples below identify the collation sequences that would be used to determine the results of text comparisons that may be performed by various SQL statements. Note that a text comparison may not be required, and no collation sequence used, in the case of numeric, blob or NULL values.  
  188.   
  189. CREATE TABLE t1(  
  190.     a,                 -- default collation type BINARY  
  191.     b COLLATE BINARY, -- default collation type BINARY  
  192.     c COLLATE REVERSE, -- default collation type REVERSE  
  193.     d COLLATE NOCASE   -- default collation type NOCASE  
  194. );  
  195.   
  196. -- Text comparison is performed using the BINARY collation sequence.  
  197. SELECT (a = b) FROM t1;  
  198.   
  199. -- Text comparison is performed using the NOCASE collation sequence.  
  200. SELECT (d = a) FROM t1;  
  201.   
  202. -- Text comparison is performed using the BINARY collation sequence.  
  203. SELECT (a = d) FROM t1;  
  204.   
  205. -- Text comparison is performed using the REVERSE collation sequence.  
  206. SELECT ('abc' = c) FROM t1;  
  207.   
  208. -- Text comparison is performed using the REVERSE collation sequence.  
  209. SELECT (c = 'abc') FROM t1;  
  210.   
  211. -- Grouping is performed using the NOCASE collation sequence (i.e. values  
  212. -- 'abc' and 'ABC' are placed in the same group).  
  213. SELECT count(*) GROUP BY d FROM t1;  
  214.   
  215. -- Grouping is performed using the BINARY collation sequence.  
  216. SELECT count(*) GROUP BY (d || '') FROM t1;  
  217.   
  218. -- Sorting is performed using the REVERSE collation sequence.  
  219. SELECT * FROM t1 ORDER BY c;  
  220.   
  221. -- Sorting is performed using the BINARY collation sequence.  
  222. SELECT * FROM t1 ORDER BY (c || '');  
  223.   
  224. -- Sorting is performed using the NOCASE collation sequence.  
  225. SELECT * FROM t1 ORDER BY c COLLATE NOCASE;  
code框里的就随便看看吧。毕竟与mysql还是有点区别的。由于sqlite也是可以被下载的,所以最好是换个名字存储或者名字随机,这样别人就不容易猜了。sqlite做项目的好处是,你可以用dropbox随时备份整个项目,毕竟,sqlite只是一个文件。。。轻轻松松啊
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:14171次
    • 积分:48
    • 等级:
    • 排名:千里之外
    • 原创:10篇
    • 转载:11篇
    • 译文:0篇
    • 评论:0条
    文章分类