来自:http://www.cr173.com/html/14674_1.html 和 http://hi.baidu.com/greenappleking/blog/item/afc6a7e8add70b32b90e2ddf.html
SQLite与其他常见的DBMS的最大的不同是它对数据类型的支持。其他常见的DBMS通常支持强类型的数据,也就是每一列的类型都必须预先指定,但是SQLite采用的是弱类型的字段。
一、存储类型和数据类型:
SQLite将数据值的存储划分为以下几种存储类型:BLOB: 存储Blob数据,该类型数据和输入数据完全相同。
要注意,这些类型是值本身的属性而不是列的属性
SQLite并没有提供专门的布尔存储类型,取而代之的是存储整型1表示true,0表示false。
2. 日期和时间数据类型:INTEGER: 以Unix时间形式保存数据值,即从1970-01-01 00:00:00到当前时间所流经的秒数。
具体的值比如SQL语句部分的带双引号或单引号的文字被定义为文本,如果文字没有带引号并没有小数点或指数则被定义为整数,如果文字没有带引号但有小数点或指数则被定义为实数,如果值是空则被定义为空值。BLOB数据使用X'ABCD'来标识
二、类型亲缘性:
为了最大化SQLite和其它数据库引擎之间的数据类型兼容性,SQLite提出了"类型亲缘性(Type Affinity)"的概念。我们可以这样理解"类型亲缘性 ",在表字段被声明之后,SQLite都会根据该字段声明时的类型为其选择一种亲缘类型,当数据插入时,该字段的数据将会优先采用亲缘类型作为该值的存储方式,除非亲缘类型不匹配或无法转换当前数据到该亲缘类型,这样SQLite才会考虑其它更适合该值的类型存储该值。SQLite目前的版本支持以下五种亲缘类型:
亲缘类型 | 描述 |
TEXT | 数值型数据在被插入之前,需要先被转换为文本格式,之后再插入到目标字段中。 |
NUMERIC |
|
INTEGER | 对于亲缘类型为INTEGER的字段,其规则等同于NUMERIC,唯一差别是在执行CAST表达式时 |
REAL | 其规则基本等同于NUMERIC,唯一的差别是不会将"30000.0"这样的文本数据转换为INTEGER存储方式。 |
NONE | 不做任何的转换,直接以该数据所属的数据类型进行存储。 |
声明类型 | 亲缘类型 | 应用规则 |
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 |
如下图,创建一个新表,两列的类型分别是int 和varchar,但是还是可以插入其他类型的数据,并且可以正确读出。
要注意SQLite的这种特性可能会给SQLite的ADO驱动造成一些麻烦,因为.NET 都是强类型的语言,必须把数据库中的字段转换为合适的类型,所以在插入数据的时候,还是应该严格的按照create table中的定义插入数据。
(2)自增列
在SQL Server中,只需要指定identity(1,1)就可以设定自增列,但是在SQLite中不支持这样做。在SQLite中,任何一张表都有一个字段 类型是Integer,且是自增的,这个列是作为B树的索引的,它的名字是ROWID,如下图所示:
test2表虽然只有一列,但是ROWID列还是存在的。在程序中对任何一张表都可以使用 ROWID作为自增列。不过这样可能导致和其他数据库的不兼容,SQLite中如果一个列的声明类型是Integer,并且是主键,那么这个列的名字就成 为ROWID的别名。注意,声明类型必须是Integer,而不能是int或bigint之类。例如:
注意上面例子的最后3条语句,它显示了SQLite默认的自增列算法是在当前表中最大的数再 加1,这样可能导致的结果是ID被重复使用——当最后一条数据被删除的时候。这与SQL Server的Identity列的行为是不一致的,例如:
SQL Server会记住每一次插入的序号,哪怕它已经被删除了。要实现SQL Server 这样的效果,需要使用autoincrement关键字。如下例所示:
不过 autoincrement关键字不被SQL Server支持(我不知道SQL 92标准中是否有此关键字),同样SQL Server的 indentity关键字在SQLite中也无法使用,因为SQLite只要求声明类型必须是integer才可以启用自增列。所以,我想不出什么方法能 使建库的脚本能够不加修改的被两种数据库使用。
(3) 日期函数
Sqlite的日期函数比较有特色,它的使用本质上是调用C的库函数strftime,基本 使用方法如下:
(4) 不被支持的特性
用户自定义函数,存储过程
外键的约束(不过可以通过自定义触发器来替代)
right out join , full out join
grant revoke