SQLite数据类型和亲缘类型+MySQL关键字

前端之家收集整理的这篇文章主要介绍了SQLite数据类型和亲缘类型+MySQL关键字前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

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
1
CHARACTER(20)
VARCHAR(255)
VARYING CHARACTER(255)
NCHAR(55)
NATIVE CHARACTER(70)
NVARCHAR(100)
TEXT
CLOB
2
BLOB 3
REAL
DOUBLE
DOUBLE PRECISION
FLOAT
4
NUMERIC
DECIMAL(10,5)
BOOLEAN
DATE
DATETIME
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。


MysqL 字段约束 null,not null,default,auto_increment
NULL 和 NOT NULL 修饰符: 可以在每个字段后面都加上这NULL 或 NOT NULL 修饰符来指定该字段是否可以为空(NULL),还是说必须填上数据(NOT NULL)。MysqL默认情况下指定字段为NULL修饰符,如果一个字段指定为NOT NULL,MysqL则不允许向该字段插入空值(这里面说的空值都为NULL),因为这是“龟定”。 /* 创建好友表,其中id,name,pass都不能为空 */ create table friends ( id int(3) not null,name varchar(8) not null,pass varchar(20) not null ); /* 错误提示,id列不能为空 #1048 - Column 'id' cannot be null */ INSERT INTO friends VALUES ( NULL,'simaopig','simaopig' ); 但是在自增列和TIMESTAMP字段中,这个规则并不适用。向这些字段中插入NULL值将会导致插入下一个自动增加的值或者当前的时间戳。 DEFAULT 修饰符: 可以使用DEFAULT修饰符为字段设定一个默认值。当插入记录时,您老人家忘记传该字段的值时,MysqL自动为您设置上该字段的默认值。 [cc lang='MysqL'] /* 创建im表,将name字段设置为默认值'QQ' */ create table im ( id int(3) not null,name varchar(25) not null default 'QQ' ); /* 插入数据,不传name字段的值,MysqL会为其设置默认值的 您运行的 sql 语句已经成功运行了。 */ INSERT INTO im( id,name ) VALUES ( 2,'MSN' ) ; INSERT INTO im( id ) VALUES ( 3 ) ; SELECT * FROM im LIMIT 0,30; /* id name 2 MSN 3 QQ */ 如果一个字段中没有指定DEFAULT修饰符,MysqL会依据这个字段是NULL还是NOT NULL自动设置默认值。如果指定字段可以为NULL,则MysqL为其设置默认值为NULL。如果是NOT NULL字段,MysqL对于数值类型插入0,字符串类型插入空字符串,时间戳类型插入当前日期和时间,ENUM类型插入枚举组的第一条。 AUTO_INCREMENT 修饰符: AUTO_INCREMENT修饰符只适用于INT字段,表明MysqL应该自动为该字段生成一个数(每次在上一次生成的数值上面加1)。对于主键(稍候介绍),这是非常有用的。因为其允许开发者使用MysqL为每条记录创建唯一的标识符。 /* 您运行的 sql 语句已经成功运行了。 ( 查询花费 0.0170 秒 ) */ CREATE TABLE items( id int( 5 ) NOT NULL AUTO_INCREMENT PRIMARY KEY,label varchar( 255 ) NOT NULL ); /* 原文链接:https://www.f2er.com/sqlite/201330.html

猜你在找的Sqlite相关文章