sqlite3的数据类型详解
数据库-SQLite3中的数据类型
数据库-SQLite3中的数据类型------------------------------安装 Sqlite3 和数据库查看⼯具:sudo apt-get install sqlite3sudo apt-get install sqlitebrowser------------------------------基础概念: 数据表中,纵向的⼀整列叫“列”,横向的⼀整⾏叫“记录”,“记录”中每⼀格叫“字段”,字段的内容叫“数据”------------------------------SQL 创建数据表:Create Table 表名称 { 列名称列数据类型, 列名称列数据类型, ... }; ⾸先要知道,⼤多数的数据库引擎都使⽤“静态数据类型”(基本上除了 SQLite 之外的所有 SQL 数据库引擎都使⽤“静态数据类型”),使⽤静态类型,数据的类型就由它的“列”决定,与“列”类型不相符的数据是⽆法写⼊到该“列”中的。
⽽ SQLite 采⽤的是“动态数据类型”(可以理解为 SQLite 是“⽆类型限制”的),这意味着你可以保存任何类型的“数据”到任何“表”的任何“列”中(整形主键“列”除外),⽆论这“列”声明的数据类型是什么。
对于 SQLite 来说,不指定“数据类型”是完全Create Table 表名称 { 列名称, 列名称, ... }; 尽管 SQLite 为我们提供了这种⽅便,但是考虑到数据库的平台可移植性,我们在实际的开发中还是应该声明“数据类型”,并且保证“存⼊的数据类型”和“声明的数据类型”是⼀致的。
除⾮你有极为充分的理由,同时不再考虑数据库平台的移植问题,------------------------------ 虽然 SQLite 对“数据类型”没有强制要求,但 SQLite 定义了 5 种最基本的“存储类型”,它们决定了“数据”在数据库中的存在形式。
每个存放在 SQLite 数据库中的值(或者由这个数据库引擎操作的值)都属于下⾯ 5 种“存储类型”中的⼀种:1 NULL ⽆值(什么也没有,不等同于“空字符串”或 0)2 INTEGER 有符号整数(根据值的⼤⼩存储在 1、2、3、4、6、8 字节中)3 REAL 浮点数(8 字节的 IEEE 浮点数字)4 TEXT 字符串(使⽤数据库内部的编码⽅式存储,默认 UTF-8)5 BLOB 字节流(原样存储) 也就是说 SQLite 本质上只有 5 种类别的数据,在 SQLite 的数据库中,也只能存⼊这 5 种类别的数据。
sqlite3数据类型和范围 -回复
sqlite3数据类型和范围-回复SQLite是一种轻量级的关系型数据库管理系统,被广泛应用于各种移动设备、嵌入式系统和桌面应用程序。
它支持多种数据类型,每种数据类型都有其特定的范围和用途。
本文将为您详细介绍SQLite中常用的数据类型及其范围。
一、SQLite数据类型概述SQLite支持多个主要数据类型,包括NULL、INTEGER、REAL、TEXT 和BLOB。
每个数据类型都可以用于存储不同类型的数据,并且具有不同的存储要求和使用限制。
1. NULLNULL是SQLite中表示空值的特殊数据类型。
它不存储任何数据,通常用于表示缺少值或未知值。
NULL类型可以用于任何数据列中,但不能用作PRIMARY KEY或UNIQUE约束的一部分。
2. INTEGERINTEGER数据类型用于存储整数值。
在SQLite中,整数可以表示为有符号整数或无符号整数。
有符号整数采用补码表示法存储,可以表示范围从-9223372036854775808到9223372036854775807的整数。
无符号整数采用无符号数值表示法存储,可以表示范围从0到18446744073709551615的整数。
3. REALREAL数据类型用于存储浮点数值,即带有小数点的数字。
SQLite使用IEEE浮点数表示法存储REAL类型数据。
REAL类型可以存储小数、负数和指数形式的数字。
它的精度和范围取决于所使用的计算机硬件和SQLite库的版本。
一般情况下,REAL类型可以表示范围从-1.0e+308到1.0e+308的浮点数。
4. TEXTTEXT数据类型用于存储文本字符串。
它可以存储任何长度的字符串,包括空字符串。
SQLite使用UTF-8编码存储TEXT类型的数据。
UTF-8编码是一种变长字符编码,可以表示包括ASCII字符和多字节Unicode 字符在内的所有字符。
因此,TEXT类型可以存储任何语言的文本数据。
5. BLOBBLOB数据类型用于存储二进制数据,如图像、声音、视频等文件。
.Net程序使用SQLITE3和SQLite3简介
.Net程序使用SQLITE3和SQLite3简介什么是SQLite?SQLite()是一个嵌入式的数据库管理系统,符合大部分的SQL 92标准,它本身仅仅是一个数百KB的动态链接库。
它使用一个文件作为存放全部数据的场所。
在应用程序中使用的话不需要任何的配置,十分方便。
何时使用?SQLite的优点是零配置,对程序所在的计算机没有任何要求——只要有一个dll就可以,因此它尤其适合于作为个人应用程序的数据库,放在托管服务器上的访问流量不十分巨大的网站的数据库,据SQLite官网的说明,对于日点击量小于10万的网站,都是合适的——日点击率超过10万的网站是不多的。
SQLite不提供表级别的锁定,一旦有某个进程有写操作或者启用了事物,就会锁住整个数据库,从而挂起其它进程,因此它不适合于高并发的场合,也不适合C/S程序。
如何使用?SQLite本身提供了一套C/C++API的说明,另外,还有一个命令行工具。
不过,使用都不很方便。
要直接操作SQLite数据库,可以使用一个叫做SQLiteExpert的工具,它的Persona l版本是可以免费得到的。
要在.NET程序中使用SQLite,当然要一个的驱动,这个驱动很容易获得,而且不止一个版本,比较常用的是,它集成了驱动和的设计器支持。
安装了之后,在VS的Server面板中添加数据库连接,就会有Sqlite的选项:如果在页面上配置了SqlDataSource,会在webConfig中自动生成一个连接字符串:<connectionStrings><add name="SQLite3" connectionString="data source=E:\ProjectMy\ne t\ShopAds\App_Data\shop.db3;cache size=4000"providerName="System.Data.SQLite" /></connectionStrings>SQLite的连接字符串很简单,只有一个属性是必填的,那就是data source,data source 后面跟上数据库文件的路径就可以,但是如果在托管服务器上,我们无权知道文件所在的绝对路径。
sqlite 亲和类型
sqlite 亲和类型SQLite是一种轻量级的关系型数据库管理系统,具有很好的亲和性类型支持。
亲和类型是指在SQLite中,每个列的数据类型都有一个亲和类型,用于确定该列的数据在进行比较和排序时的规则。
亲和类型可以帮助开发者更好地处理不同数据类型之间的比较和排序操作,提高数据库的效率和性能。
在SQLite中,共有五种亲和类型,分别是NONE、BLOB、TEXT、NUMERIC和INTEGER。
这些亲和类型可以根据列的数据类型来确定,也可以手动指定。
下面将对这五种亲和类型进行详细介绍。
1. NONE类型:NONE类型是默认的亲和类型,当列的数据类型未指定时,该列将被赋予NONE类型。
NONE类型不做任何比较和排序,仅仅作为占位符存在。
2. BLOB类型:BLOB类型适用于存储二进制数据,如图片、音频、视频等。
BLOB类型的数据没有排序和比较规则,仅仅按照存储的字节序进行比较。
3. TEXT类型:TEXT类型适用于存储文本数据,如字符串。
TEXT 类型的数据按照字典序进行比较和排序,支持大小写敏感和不敏感的比较。
4. NUMERIC类型:NUMERIC类型适用于存储数值数据,如整数、浮点数等。
NUMERIC类型的数据按照数值大小进行比较和排序,支持整数和浮点数之间的比较。
5. INTEGER类型:INTEGER类型适用于存储整数数据。
INTEGER 类型的数据按照整数大小进行比较和排序,支持整数之间的比较。
SQLite的亲和类型可以通过使用CAST函数来进行手动转换。
例如,可以使用CAST函数将一个TEXT类型的列转换为NUMERIC类型,以便进行数值比较。
这种灵活的亲和类型支持使得SQLite在处理各种数据类型时更加方便和高效。
除了亲和类型,SQLite还提供了丰富的数据类型支持,包括整数、浮点数、字符串、日期、时间等。
开发者可以根据实际需求选择适合的数据类型,并结合亲和类型来优化数据库的性能和效率。
sqlite3使用方法
sqlite3使用方法SQLite是一个轻量级的关系型数据库管理系统。
它无需服务器,仅仅依赖于本地文件来存储数据,因此非常适合作为嵌入式数据库使用。
下面介绍SQLite3的一些基本使用方法:1. 打开SQLite3数据库:在终端中输入以下命令即可打开数据库:```sqlite3 数据库名```如果数据库不存在,会自动创建一个新的数据库。
2. 创建数据表在SQLite中,数据表可以通过一个CREATE TABLE语句来创建。
以下是一个示例:```CREATE TABLE 表名 (列1 数据类型,列2 数据类型,列3 数据类型,.....);```其中,列1、列2、列3等为表的列名,可自定义命名,而数据类型则是指该列保存的数据类型,如text表示字符串类型,integer代表整数类型,real代表实数类型等。
3. 插入数据可以使用INSERT语句来向数据表中插入数据。
以下是一个示例:```INSERT INTO 表名 (列1, 列2, 列3, ...) VALUES (值1, 值2, 值3, ...);```其中,列1、列2、列3等为数据表的列名,可自定义命名,而值1、值2、值3等为需要插入的值。
4. 查询数据SQLite中可以使用SELECT语句来查询数据。
以下是一个示例:```SELECT 列1, 列2, ... FROM 表名 WHERE 条件;```其中,列1、列2等为需要查询的列名,可自定义,表名为要查询的数据表名,而条件则为查询的条件,如“列 = 值”等。
5. 更新数据可以使用UPDATE语句来更新数据。
以下是一个示例:```UPDATE 表名 SET 列1 = 值1, 列2 = 值2, ... WHERE 条件;```其中,表名为要更新的数据表名,列1、列2等为需要更新的列名,值1、值2等为需要更新的值,条件则为更新的条件。
6. 删除数据可以使用DELETE语句来删除数据。
以下是一个示例:```DELETE FROM 表名 WHERE 条件;```其中,表名为要删除的数据表名,条件则为删除的条件。
sqlite3数据结构
SQLite3 的数据结构主要包括以下几个部分:
1.数据库文件:SQLite3 数据库是一个磁盘文件,包含了所有的数据库和表数据。
这个文件可以被多个应用程序共享,并且具有轻量级、高性能
和可靠性的特点。
2.页面(Page):SQLite3 将数据存储在页面中,每个页面大小为4096 字节。
页面是SQLite3 进行磁盘I/O 操作的基本单位,通过页面
的大小可以控制数据库的存储空间和性能。
3.B-tree 结构:SQLite3 使用B-tree 结构来存储数据,这种结构能够高效地支持数据的插入、删除和查找操作。
在SQLite3 中,每个表都
对应一棵B-tree,用于存储表中的数据。
4.记录(Row):每个记录对应B-tree 中的一条节点,记录包含了表中所有的列数据。
在SQLite3 中,记录的大小最大为65536 字节,
可以存储大量的数据。
5.索引(Index):为了提高查询性能,SQLite3 还支持索引。
索引是一种特殊的数据结构,通过索引可以快速地找到表中满足特定条件的数据。
在SQLite3 中,索引和表使用相同的B-tree 结构。
6.触发器(Trigger)和存储过程(Stored Procedure):SQLite3 还支持触发器和存储过程,这些是高级的SQL 功能,可以用于实现复杂的业
务逻辑。
以上就是SQLite3 的主要数据结构,这些结构共同构成了SQLite3 数据库的完整体系。
sqlite3:深入理解sqlite3_stmt机制
sqlite3:深⼊理解sqlite3_stmt机制我们在使⽤sqlite3的过程中,涉及到批量操作时(批量插⼊、批量读。
),总会遇到 sqlite3_stmt这个数据类型,按照官⽅解释说法是这样的:sqlite3_stmt是C接⼝中“准备语句对象”,该对象是⼀条SQL语句的实例,⽽且该语句已经编译成⼆进制形式,可以直接进⾏计算。
它并不是我们所熟悉的sql语句,⽽是⼀个已经把sql语句解析了的,⽤sqlite3⾃⼰标记记录的内部数据结构,可以被直接执⾏的语句,所以,如果结合变量,采⽤sqlite3_stmt结构,会使得批量操作执⾏的效率⼤⼤提⾼,我们可以进⼀步这么理解:sqlite3的C接⼝函数,最重要函数之⼀的是 sqlite3_exec,也就是执⾏sql语句函数,该函数运⾏需要配套⼀个 sql语句字符串和相应的回调函数,当执⾏sqlite3_exec时,数据库先把sql语句字符串(就是普通的字符串)进⾏解析,然后再编译,然后再执⾏,基本上需要这3个步骤,要知道,解析和编译都是很耗费算⼒的,效率上势必不会太好。
如果引⼊sqlite3_stmt数据结构后,也是要配合⼀条普通的sql语句的,基本步骤也是解析、编译、执⾏,貌似没有太⼤的优势,但是sqlite3_stmt是可以结合变量使⽤的,也就是可以通过变量实现相同操作的循环,这个时候,sqlite3_stmt结构通过sqlite3_prepare_v2函数,可以实现对sql语句(模板)的解析和编译,⽣成了可以被执⾏的 sql语句实例,那么后⾯我们只需要通过sqlite3_bind_xx函数去绑定赋值变量,通过sqlite3_step进⾏执⾏,相⽐较使⽤sqlite3_exec函数,sql语句的解析和编译只执⾏了⼀次,⽽sqlite3_step执⾏多次,整体的效率势必⼤⼤提升。
我们在进⾏循环操作时,与sqlit3_stmt配套的功能函数如下:(1)创建sqlite3_stmt对象,使⽤ sqlite3_prepare_v2();(2)绑定参数值到sqlite3_stmt独享,使⽤sqlite3_bind_*();(3)运⾏sql语句,使⽤sqlite3_step(),可以是⼀次,也可以是循环执⾏。
sqlite3使用日期时间数据类型
sqlite3使用日期时间数据类型SQLite3是一种开源的轻量级关系型数据库管理系统,支持多种数据类型,包括日期和时间数据类型。
在SQLite3中,日期和时间可以使用以下几种数据类型来存储和处理。
1.TEXT数据类型:可以用于存储格式为"YYYY-MM-DDHH:MM:SS"的日期和时间数据。
例如,可以使用以下命令创建一个表格来存储日期和时间信息:CREATE TABLE mytableid INTEGER PRIMARY KEY,可以使用以下命令向表格中插入日期和时间数据:2.INTEGER数据类型:可以用于存储UNIX时间戳。
UNIX时间戳是从1970年1月1日UTC(协调世界时)开始的秒数。
以下是一个示例表格的创建及插入数据的命令:CREATE TABLE mytableid INTEGER PRIMARY KEY,3. REAL数据类型:可以用于存储日期和时间的Julian day数。
Julian day是天文学中广泛使用的日期表示方法,表示自公历前4713年1月1日中午12点以来的天数。
以下是一个示例表格的创建及插入数据的命令:CREATE TABLE mytableid INTEGER PRIMARY KEY,julian_day REAL4.BLOB数据类型:可以用于存储包含日期和时间信息的二进制数据。
这种情况下,需要自定义一种格式来存储和解析日期和时间数据。
以下是一个示例表格的创建及插入数据的命令:CREATE TABLE mytableid INTEGER PRIMARY KEY,使用日期和时间数据类型,可以进行一些常见的查询和操作,如按照日期范围筛选数据、计算日期之间的差值、排序等等。
例如,可以使用以下命令查询其中一日期范围内的数据:可以使用以下命令计算两个日期之间的差值:SELECT julianday('2024-01-31') - julianday('2024-01-01');以上是关于SQLite3使用日期和时间数据类型的基本介绍,包括了各种数据类型的创建和插入示例,以及一些常见的查询和操作命令。
sqlite支持的数据类型详解
SQLite3 数据类型NULLINTEGERREALTEXTBLOB但实际上,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不能超过2000date 包含了年份、月份、日期。
time 包含了小时、分钟、秒。
timestamp 包含了年、月、日、时、分、秒、千分之一秒。
1.存储类别第二版把所有列的值都存储成ASCII文本格式。
第三版则可以把数据存储成整数和实数,还可以存储BLOB 数据.Each value stored in an SQLite数据库中存储的每个值都有一个属性,都属于下面所列类中的一种,(被数据库引擎所控制)NULL: 这个值为空值INTEGER: 值被标识为整数,依据值的大小可以依次被存储为1,2,3,4,5,6,7,8.REAL: 所有值都是浮动的数值,被存储为8字节的IEEE浮动标记序号.TEXT: 值为文本字符串,使用数据库编码存储(TUTF-8, UTF-16BE or UTF-16-LE).BLOB: 值是BLOB数据,如何输入就如何存储,不改变格式.像SQLite2.0版一样,在3.0版中,除了INTEGER PRIMARY KEY,数据库中的任何列都可以存储任何类型的数据.这一规则也有例外,在下面的"严格相似模式"中将描述.输入SQLite的所有值,不管它是嵌入SQL语句中的文字还是提前编译好的绑定在SQL语句中的值,在SQL语句执行前都被存储为一个类.在下面所描述的情况下,数据库引擎将在执行时检查并把值在数字存储类(整数和实数)和文本类间转换.存储的类别最初被分类为如下:具体的值比如SQL语句部分的带双引号或单引号的文字被定义为文本,如果文字没带引号并没有小数点或指数则被定义为整数,如果文字没带引号但有小数点或指数则被定义为实数,如果值是空则被定义为空值.BLOB数据使用符号X'ABCD'来标识.Values supplied using the 被输入的值使用sqlite3_bind_* APIs的被分类一个存储等级,这等级是和原来的类基本相一致的. (比如sqlite3_bind_blob()绑定一个BLOB的值).值的分类是SQL分等级操作的结果,决定于最远的操作表达式.用户定义的功能也许会把值返回任意的类.在编译的时候来确定表达式的存储类基本是不可能的.2. 列之间的亲和性在SQLite3.0版中,值被定义为什么类型只和值自身有关,和列没有关系,和变量也没有关系. (这有时被称作弱类型.)所有其它的我们所使用的数据库引擎都受静态类型系统的限制,其中的所有值的类是由其所属列的属性决定的,而和值无关.为了最大限度的增加SQLite数据库和其他数据库的兼容性,SQLite支持列的"类型亲和性". 列的亲和性是为该列所存储的数据建议一个类型.我们要注意是建议而不是强迫.在理论上来讲,任何列依然是可以存储任何类型的数据的. 只是针对某些列,如果给建议类型的话,数据库将按所建议的类型存储.这个被优先使用的数据类型则被称为"亲和类型".在SQLite3.0版中,数据库中的每一列都被定义为以下亲和类型中的一种:文本数字的整数无一个具有类型亲和性的列按照无类型,文本,或BLOB存储所有的数据.如果数字数据被插入一个具有文本类型亲和性的列,在存储之前数字将被转换成文本.一个具有数字类型亲和性的列也许使用所有的五个存储类型存储值.当文本数据被插入一个数字列时,在存储之前,数据库将尝试着把文本转换成整数或实数.如果能成功转换的话,值将按证书活实数的类型被存储. 如果不能成功转换的话,值则只能按文本类型存储了,而不会被转换成无类型或BLOB类型来存储.一个具有整数亲和力的列在转换方面和具有数字亲和力的列是一样的,但也有些区别,比如没有浮动量的实值(文本值转换的值)被插入具有整数亲和力的列时,它将被转换成整数并按整数类型存储.一个具有无类型亲和力的列不会优先选择使用哪个类型.在数据被输入前它不会强迫数据转换类型.2.1 列的亲和性的决定一个列的亲和类型是由该列所宣称的类型决定的.遵守以下规则:如果数据类型包括字符串"INT"那么它被定义成具有整数亲和性.如果列中的数据类型包括以下任何的字符串"CHAR", "CLOB", or "TEXT" 那么这个列则具有文本亲和性.要注意VARCHAR类型包括字符串"CHAR"因此也具有文本类型亲和性.如果一个列的数据类型包括字符串"BLOB"或者如果数据类型被具体化了,那么这个列具有无类型亲和性. 否则就具有数字类型亲和性.如果表格使用If "CREATE TABLE AS SELECT..."语句生成的,那么所有的列则都没有具体的数据类型,则没有类型亲和性.2.2 列的亲和性的例子CREATE TABLE t1(t TEXT,nu NUMERIC,i INTEGER,no BLOB);-- Storage classes for the following row:-- TEXT, REAL, INTEGER, TEXTINSERT INTO t1 VALUES('500.0', '500.0', '500.0', '500.0');-- Storage classes for the following row:-- TEXT, REAL, INTEGER, REALINSERT INTO t1 VALUES(500.0, 500.0, 500.0, 500.0);3.比较表达式像SQLite2.0版一样,3.0版的一个特性是二进制比较符'=', '<', '<=', '>=' and '!=',一个操作'IN'可以测试固定的成员资格, 三重的比较操作符'BETWEEN'.比较的结果决定于被比较的两个值的存储类型。
sqlite3使用日期、时间数据类型
Sqlite3使用日期、时间数据类型(梁仲宏 - 2017-08-18于深圳)1.sqlite3支持如下日期、时间数据类型。
date包含了年份、月份、日期。
time包含了小时、分钟、秒。
timestamp包含了年、月、日、时、分、秒、千分之一秒。
2. date、time、timestamp说明sqlite3对“date”,“time”,“timestamp”是作为字符串处理,但是这些字符格式比较特殊而已,,格式总结如下。
2.1.对于“date”,合法格式是:YYYY-MM-DD2.2. 对于“time”,合法格式是:HH:MMHH:MM:SSHH:MM:SS.SSS2.3. 对于“timestamp”,合法格式是:YYYY-MM-DD HH:MMYYYY-MM-DD HH:MM:SSYYYY-MM-DD HH:MM:SS.SSSYYYY-MM-DDTHH:MMYYYY-MM-DDTHH:MM:SSYYYY-MM-DDTHH:MM:SS.SSS3. sqlite3内部日期、时间操作函数。
3.1.内部函数Sqlite3内部提供了如下函数操作日期,时间。
分别说明如下:1.date(timestring, modifier, modifier, ...)功能:对输入时间timestring,按modifier调整后输出日期字符串“YYYY-MM-DD”。
注意:timestring是必须的。
modifier可有可无。
2.time(timestring, modifier, modifier, ...)功能:对输入时间timestring,按modifier调整后输出时间字符串“HH:MM:SS”。
注意:timestring是必须的。
modifier可有可无。
3.datetime(timestring, modifier, modifier, ...)功能:对输入时间timestring,按modifier调整后输出日期,时间字符串“YYYY-MM-DD HH:MM:SS”。
sqlite3数据类型和函数
sqlite3数据类型和函数sqlite3⽀持的数据类型:NULL、INTEGER、REAL、TEXT、BLOB但是,sqlite3也⽀持如下的数据类型smallint 16位整数integer 32位整数decimal(p,s) p是精确值,s是⼩数位数float 32位实数double 64位实数char(n) n长度字符串,不能超过254varchar(n) 长度不固定最⼤字符串长度为n,n不超过4000graphic(n) 和 char(n) ⼀样,但是单位是两个字符double-bytes,n不超过127(中⽂字)vargraphic(n) 可变长度且最⼤长度为ndate 包含了年份、⽉份、⽇期time 包含了⼩时、分钟、秒timestamp 包含了年、⽉、⽇、时、分、秒、千分之⼀秒sqlite3⽀持的函数【1】⽇期函数datetime() :产⽣⽇期和时间date():产⽣⽇期time():产⽣时间strftime():对以上3个函数产⽣的⽇期和时间进⾏格式化⽤法实例:1、SELECT date('2011-9-9','+1 day','+1 year'); 结果是 2010-09-102、SELECT datetime('now'); 当前⽇期和时间3、SELECT datetime('now', 'start of month'); 本⽉的第⼀天零点,也可以设置年和⽇的第⼀天4、SELECT datetime('now','+1 hour','-12 minute'); 当前时间加48分钟strftime()函数可以将YYYY-MM-DD HH:MM:SS格式的⽇期字符串转换为其它形式的字符串%d:天数,01-31%f :⼩数形式的秒,SS.SSS%H:⼩时%j :某⼀天是该年的第⼏天,001-366%m:⽉份,00-12%M:分钟,00-59%s:从1970到现在的秒数%S:秒,00-59%w:星期,0-6,0是星期天%W:某天是该年的第⼏周,01-53%Y:年,YYYY%% 百分号应⽤举例:SELECT strftime('%Y.%m.%d %H:%M:%S','now','localtime');⼆、【算术函数】abs(X):返回绝对值max(X,Y[,...]):返回最⼤值min(X,Y,[,...]):返回最⼩值random(*):返回随机数round(X[,Y]):四舍五⼊三、【字符串处理函数】length(x) :返回字符串字符个数lower(x) :⼤写转⼩写upper(x):⼩写转⼤写substr(x,y,Z):截取⼦串like(A,B):确定给定的字符串与指定的模式是否匹配四、【条件判断函数、集合函数、其它函数】typeof(x):返回数据的类型last_insert_rowid():返回最后插⼊的数据的ID********************************************************************************************************************sqlite3提供了C函数接⼝来操作sqlite3数据库,其中有个关键数据结构 sqlite3 * 类型1、打开数据库int sqlite3_open(⽂件名,sqlite3 **); - ⽂件名若不存在,则会⾃动创建返回SQLITE_OK表⽰操作正常,这些宏的定义在sqlite3.h⽂件中定义,看源代码会懂的更多2、关闭数据库int sqlite3_close(sqlite3 *);3、SQL语句操作int sqlite3_exec(sqlite3 *,const char *sql, sqlite3_callback,void *,char **errmsg);这就是执⾏⼀条sql语句的函数参数1:open函数得到的指针参数2:⼀条sql语句,以'\0'结尾参数3:sqlite3_callback是回调,当这条语句执⾏后,sqlite3会调⽤你提供的这个函数,回调函数要查阅资料参数4:void *是⾃⼰提供的指针,可以传递任何指针到这⾥,这个参数最终会传到回调函数⾥⾯,如果不需要传到回调函数⾥⾯,则可以设置为NULL参数5:错误信息,当执⾏失败时,可以查阅这个指针,可以利⽤printf("%s\n",errmsg)得到⼀串字符串信息,该信息表明出错的地⽅通常,sqlite3_callback和void *都设置为NULL,表⽰不需要回调,⽐如做insert、delete操作,就没有必要使⽤回调,⽽当使⽤select时,就要使⽤回调,因为sqlite3把数据查出来,得通过回调来说明查出什么数据回调函数的定义格式:typedef int (*sqlite3_callback)(void *,int,char **,char **);实例如下://sqlite 每查到⼀条记录,就调⽤⼀次这个回调int LoadMyInfo(void *para,int n_column,char **column_value,char **column_name){/*para: 在sqlite3⾥传⼊的void *参数,通过该参数可以传⼊⼀些特殊指针*如类指针、结构指针,然后在这⾥转换成对应的类型(这⾥是void *类型),*必须强制转换成⾃⼰的类型才可⽤,然后操作这些数据*///n_column: 该记录有多少个字段(列)/*char **column_value 保存着查出来的数据,实际上是个1维数组,每⼀个元素都是*char *值,是⼀个字段内容(⽤字符串表⽰,以\0结尾)*///char **column_name 与 column_value 是对应的,表⽰这个字段的字段名称//这⾥不是⽤para参数printf("%=记录包含%d\n个字段",n_column);for(i=0;i<n_column;i++){printf("字段名: %s ,字段值:%s\n",column_name[i],column_value[i]);}printf("\n");return 0;}int main(int , char **){sqlite3 *db;int result;char *errmsg = NULL;char sql[512];result = sqlite3_open("My.db",&db);if(result != SQLITE_OK){//数据库打开失败return -1;}//创建数据表strcpy(sql,"CREATE TABLE test(ID INTEGER PRIMARY KEY,NAME VARCHAR(32));");result = sqlite3_exec(db,sql,NULL,NULL,errmsg);if(result != SQLITE_OK){printf("创建表失败,错误:%s\n",errmsg);}//插⼊记录strcpy(sql,"INSERT INTO test VALUES(1,'OK');");result = sqlite3_exec(db,sql,0,0,errmsg);if(result != SQLITE_OK){printf("插⼊记录失败,错误:%s\n",errmsg);}//查询数据库strcpy(sql,"SELECT * FROM test;");result = sqlite3_exec(db,sql,LoadMyInfo,NULL,errmsg);sqlite3_close(db);return 0;}以上是通过回调查询数据库,如果该函数在C++中,就要将其声明成static类型,因为C++成员函数隐藏了⼀个参数:this,C++调⽤类的成员函数的时候,隐含把类指针当函数的第⼀个参数传递进去,就与上⾯的sqlite回调函数参数不符除了使⽤回调来查询,还可以使⽤⾮回调的查询,通过sqlite3_get_table函数做到int sqlite3_get_table(sqlite3*,const char *sql,char ***resultp,int *nrow,int *ncolumn,char **errmsg);参数3:resultp 是⼀维数组,第⼀⾏是字段名称,跟着是每个字段的值参数4:查询共多少条记录参数5:查询共多少个字段操作实例如下:int main(int ,char **){sqlite3 *db;int result;char *errmsg = NULL;char **dbResult;int nRow,nColumn;int i,j;int index;char sql[512];result = sqlite3_open("My.db",&db);if(result != SQLITE_OK){return -1;}result = sqlite3_get_table(db,sql,&dbResult,&nRow,&nColumn,&errmsg);//查询成功if(SQLITE_OK == result){//dbResult第⼀⾏是字段名称,从nColumn索引开始时真正的数据index = nColumn;printf("查询到%d记录\n",nRow);for(i=0;i<nRow;i++){for(j=0;j<nColumn;j++){printf("字段名称:%s,字段值:%s\n",dbResult[j],dbResult[index]);index++;}printf("\n");}}//释放char**查询结果sqlite3_free_table(dbResult);sqlite3_close(db);return 0;}上述使⽤的⽅法适⽤于⼤多数数据库需求,但是不能适⽤于⼆进制数据,操作⼆进制数据⽅法需要⽤到⼀个数据类型sqlite3_stmt *,该数据类型记录了⼀个"sql语句",这⾥的sql语句是解析后的,⽤sqlite⾃⼰标记记录的内部数据结构,并不是我们熟悉的sql语句数据插⼊到sqlite3_stmt结构⾥可不能直接memcpy,也不能像std::string那样⽤+号,必须⽤sqlite提供的函数来插⼊。
sqlite 数字类型
sqlite 数字类型
SQLite具有以下五种数据类型:
1. NULL:空值。
2. INTEGER:带符号的整型,具体取决于存入数字的范围大小。
3. REAL:浮点数字,存储为8-byte IEEE浮点数。
4. TEXT:字符串文本。
5. BLOB:二进制对象。
但实际上,sqlite3也接受如下的数据类型:
1. smallint:16位元的整数。
2. integer:32位元的整数。
3. decimal(p,s):p精确值和s大小的十进位整数,精确值p是指全部有几个数(digits)大小值,s是指小数点后有几位数。
如果没有特别指定,则系统会设为 p=5; s=0。
4. float:32位元的实数。
5. double:64位元的实数。
6. char(n):n长度的字串,n不能超过254。
7. varchar(n):长度不固定且其最大长度为n的字串,n不能超过4000。
以上内容仅供参考,如需获取更多关于SQLite的数据类型信息,建议查阅SQLite官方文档或咨询数据库专业人士。
oc sqlite3类型声明
oc sqlite3类型声明在Objective-C中使用SQLite3数据库时,你需要使用C语言的SQLite3 API。
以下是一些常见的SQLite3数据类型声明和Objective-C中对应的类型:1. INTEGER(整数)- SQLite3声明:`INTEGER`- Objective-C类型:`NSInteger` 或`int`2. REAL(浮点数)- SQLite3声明:`REAL`- Objective-C类型:`double` 或`float`3. TEXT(文本)- SQLite3声明:`TEXT`- Objective-C类型:`NSString`4. BLOB(二进制数据)- SQLite3声明:`BLOB`- Objective-C类型:`NSData`在使用SQLite3 API时,你将会使用C语言的数据类型,而在Objective-C中,你可以将这些C语言类型与Objective-C的对象类型进行转换。
以下是一个简单的例子:```objective-c#import <sqlite3.h>// 打开数据库sqlite3 *database;NSString *databasePath = @"your_database_path.sqlite";if (sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) {NSLog(@"Database opened successfully.");// 创建查询语句const char *sqlStatement = "CREATE TABLE IF NOT EXISTS myTable (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER)";char *errMsg;// 执行查询if (sqlite3_exec(database, sqlStatement, NULL, NULL, &errMsg) == SQLITE_OK) { NSLog(@"Table created successfully.");// 插入数据const char *insertSQL = "INSERT INTO myTable (name, age) VALUES ('John Doe', 25)";if (sqlite3_exec(database, insertSQL, NULL, NULL, &errMsg) == SQLITE_OK) {NSLog(@"Data inserted successfully.");// 查询数据const char *selectSQL = "SELECT * FROM myTable";sqlite3_stmt *statement;if (sqlite3_prepare_v2(database, selectSQL, -1, &statement, NULL) == SQLITE_OK) {while (sqlite3_step(statement) == SQLITE_ROW) {int primaryKey = sqlite3_column_int(statement, 0);NSString *name = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(statement, 1)];int age = sqlite3_column_int(statement, 2);NSLog(@"ID: %d, Name: %@, Age: %d", primaryKey, name, age);}}// 关闭查询语句sqlite3_finalize(statement);} else {NSLog(@"Failed to insert data. Error: %s", errMsg);}} else {NSLog(@"Failed to create table. Error: %s", errMsg);}// 关闭数据库sqlite3_close(database);} else {NSLog(@"Failed to open database.");}```请注意,这只是一个简单的例子,实际上,你可能会使用更复杂的方法来处理数据库连接、查询和结果。
sqlite3 中文手册
sqlite3 中文手册引言概述:SQLite是一种轻量级的关系型数据库管理系统,广泛应用于移动设备和嵌入式系统中。
它具有简单易用、高效稳定的特点,而且还支持中文语言。
本文将详细介绍SQLite3中文手册的内容,包括基本概念、数据库操作、数据类型、查询语句和事务管理等方面。
正文内容:1. 基本概念1.1 数据库管理系统(DBMS)的定义和作用1.2 SQLite3的特点和优势1.3 SQLite3与其他数据库管理系统的比较1.4 SQLite3的安装和配置2. 数据库操作2.1 数据库的创建和删除2.2 表的创建和删除2.3 数据的插入、更新和删除2.4 数据库的备份和恢复2.5 数据库的导入和导出3. 数据类型3.1 SQLite3支持的数据类型3.2 数据类型的定义和使用3.3 数据类型的转换和比较3.4 数据类型的约束和索引3.5 数据类型的存储和检索4. 查询语句4.1 SELECT语句的基本语法和用法4.2 WHERE子句的使用和常见操作符4.3 ORDER BY子句的排序规则和示例4.4 GROUP BY子句的分组和聚合函数4.5 JOIN语句的连接和多表查询5. 事务管理5.1 事务的定义和特性5.2 事务的开始和提交5.3 事务的回滚和保存点5.4 事务的并发和锁定机制5.5 事务的隔离级别和并发控制总结:综上所述,SQLite3中文手册详细介绍了数据库管理系统的基本概念和SQLite3的特点,以及数据库操作、数据类型、查询语句和事务管理等方面的内容。
通过学习这些知识,我们可以更好地理解和应用SQLite3,提高数据库的管理和查询效率。
希望本文对读者有所帮助,进一步掌握SQLite3的使用技巧。
SQLite数据类型菜鸟教程
SQLite数据类型菜鸟教程SQLite 数据类型SQLite 数据类型是一个用来指定任何对象的数据类型的属性。
SQLite 中的每一列,每个变量和表达式都有相关的数据类型。
您可以在创建表的同时使用这些数据类型。
SQLite 使用一个更普遍的动态类型系统。
在 SQLite 中,值的数据类型与值本身是相关的,而不是与它的容器相关。
SQLite 存储类每个存储在 SQLite 数据库中的值都具有以下存储类之一:存储类描述NULL 值是一个 NULL 值。
INTEGER 值是一个带符号的整数,根据值的大小存储在1、2、3、4、6 或 8 字节中。
REAL 值是一个浮点值,存储为 8 字节的 IEEE 浮点数字。
TEXT 值是一个文本字符串,使用数据库编码(UTF-8、UTF-16BE 或 UTF-16LE)存储。
BLOB 值是一个 blob 数据,完全根据它的输入存储。
SQLite 的存储类稍微比数据类型更普遍。
INTEGER 存储类,例如,包含 6 种不同的不同长度的整数数据类型。
SQLite Affinity 类型SQLite 支持列上的类型affinity概念。
任何列仍然可以存储任何类型的数据,但列的首选存储类是它的affinity。
在SQLite3 数据库中,每个表的列分配为以下类型的 affinity 之一:Affinity 描述TEXT 该列使用存储类 NULL、TEXT 或 BLOB 存储所有数据。
NUMERIC 该列可以包含使用所有五个存储类的值。
INTEGER 与带有 NUMERIC affinity 的列相同,在 CAST 表达式中带有异常。
REAL 与带有 NUMERIC affinity 的列相似,不同的是,它会强制把整数值转换为浮点表示。
NONE 带有affinity NONE 的列,不会优先使用哪个存储类,也不会尝试把数据从一个存储类强制转换为另一个存储类。
SQLite Affinity 及类型名称下表列出了当创建SQLite3 表时可使用的各种数据类型名称,同时也显示了相应的应用 Affinity:数据类型Affinity•INT•INTEGER•TINYINT•SMALLINT•MEDIUMINTINTEGER•BIGINT•UNSIGNED BIGINT•INT2•INT8•CHARACTER(20)•VARCHAR(255)•VARYINGCHARACTER(255)•NCHAR(55)TEXT•NATIVECHARACTER(70)•NVARCHAR(100)•TEXT•CLOB•BLOB•no datatypeNONEspecified•REAL•DOUBLE•DOUBLEREALPRECISION•FLOAT•NUMERICNUMERIC•DECIMAL(10,5)•BOOLEAN•DATE•DATETIMEBoolean 数据类型SQLite 没有单独的 Boolean 存储类。
sqlite3 十进制转十六进制
sqlite3 十进制转十六进制【原创实用版】目录1.SQLite3 简介2.十进制与十六进制的概念3.SQLite3 中十进制转十六进制的方法4.示例与实践正文【1.SQLite3 简介】SQLite3 是一款轻量级的数据库管理系统,它将整个数据库存储在一个磁盘文件中。
SQLite3 支持多种数据类型,其中包括整数类型,如十进制和十六进制。
【2.十进制与十六进制的概念】十进制是我们日常生活中常用的计数方式,它的基数为 10。
而十六进制,也称为十六进制,是一种计数方式,它的基数为 16,通常使用 0-9 和 A-F 表示 0-15。
【3.SQLite3 中十进制转十六进制的方法】在 SQLite3 中,可以使用内置函数将十进制数转换为十六进制数。
具体方法是使用`CAST()`函数和`X`操作符。
`CAST()`函数用于将一个数值表达式转换为指定的数据类型,而`X`操作符表示将数值转换为十六进制数。
例如,要将十进制数 123 转换为十六进制数,可以使用以下 SQL 语句:```pythonSELECT CAST(123 AS X) FROM DUAL;```执行结果为:`123`的十六进制表示为`7B`。
【4.示例与实践】假设我们有一个 SQLite3 数据库,其中有一个名为`users`的表,表中有一个名为`id`的整数列,我们想要将`id`列的值从十进制转换为十六进制。
可以使用以下 SQL 语句:```pythonSELECT id, CAST(id AS X) AS hex_id FROM users;```执行结果将为每个用户的`id`列显示十进制和十六进制表示。
sqlite3数据类型和范围
sqlite3数据类型和范围SQLite是一种嵌入式关系型数据库管理系统,支持多种数据类型。
数据类型在定义数据表结构时起着关键作用,决定了所能存储的数据范围和操作的规则。
下面将详细介绍SQLite3所支持的数据类型及其范围。
1. NULL类型: NULL类型是用于表示缺少值或未知值的特殊类型,可以赋值给任何其他数据类型。
2. INTEGER类型: INTEGER类型用于存储整数值,可以是有符号的或无符号的。
SQLite采用的是动态类型系统,INTEGER类型的数据可以存储1、2、4、6或8个字节的整数值,范围为-9223372036854775808到9223372036854775807(8个字节)或0到18446744073709551615(无符号)。
3. REAL类型: REAL类型用于存储浮点数值,即带有小数的数值。
它采用8字节的IEEE浮点表示,范围为-1.0e+308到+1.0e+308。
4. TEXT类型: TEXT类型用于存储字符串值,可以存储最长为2^31-1个字符的文本。
SQLite不区分大小写,因此在比较文本时,大小写不敏感。
5. BLOB类型: BLOB类型用于存储二进制数据,可以存储最长为2^31-1个字节的数据。
它可以用于存储图像、音频、视频等非文本数据。
除了以上常见的数据类型,SQLite还提供了以下几种特殊的数据类型:6. NUMERIC类型: NUMERIC类型用于存储数字值,可以是整数或浮点数。
它可以根据具体的值自动调整为INTEGER或REAL类型。
7. BOOLEAN类型: BOOLEAN类型用于存储布尔值,可以是True或False。
8. DATE类型: DATE类型用于存储日期值,格式为YYYY-MM-DD。
9. TIME类型: TIME类型用于存储时间值,格式为HH:MM:SS。
10. DATETIME类型: DATETIME类型用于存储日期和时间值,格式为YYYY-MM-DD HH:MM:SS。
易语言外部数据库sqlite3教程
易语言外部数据库sqlite3教程易语言外部数据库sqlite3教程===========================================================第一部分 sqlite基础----------------------------------------------------------- 1、什么是sqlietSQLite是一个软件库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。
SQLite是一个增长最快的数据库引擎,这是在普及方面的增长,与它的尺寸大小无关。
SQLite 源代码不受版权限制。
SQLite与其他SQL数据库不同,SQLite没有单独的服务器进程。
它直接读取和写入普通磁盘文件。
具有多个表,索引,触发器和视图的完整SQL数据库包含在单个磁盘文件中。
-----------------------------------------------------------2、为什么要用 SQLite?不需要一个单独的服务器进程或操作的系统(无服务器的)。
SQLite 不需要配置,这意味着不需要安装或管理。
一个完整的 SQLite 数据库是存储在一个单一的跨平台的磁盘文件。
SQLite 是非常小的,是轻量级的,完全配置时小于400KiB,省略可选功能配置时小于250KiB。
SQLite 是自给自足的,这意味着不需要任何外部的依赖。
SQLite 事务是完全兼容 ACID 的,允许从多个进程或线程安全访问。
SQLite 支持 SQL92(SQL2)标准的大多数查询语言的功能。
SQLite 使用 ANSI-C 编写的,并提供了简单和易于使用的API。
SQLite 可在UNIX(Linux, Mac OS-X, Android, iOS)和Windows(Win32, WinCE, WinRT)中运行。
-----------------------------------------------------------3、常用易语言单机的、免费、轻量级数据库比较易语言自带数据库易数据库可以说不能称为数据库,它只是“表”,而且还是单张表,所以直接PASS掉。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
sqlite3中的数据类型大多数的数据库引擎(到现在据我们所知的除了sqlite的每个sql数据库引擎)都使用静态的、刚性的类型,使用静态类型,数据的类型就由它的容器决定,这个容器是这个指被存放的特定列。
Sqlite使用一个更一般的动态类型系统,sqlite中,值的数据类型跟值本身相关,而不是与它的容器相关。
Sqlite的动态类型系统和其他数据库的更为一般的静态类型系统相兼容,但同时,sqlite中的动态类型允许它能做到一些传统刚性类型数据库所不可能做到的事。
1.存储类和数据类型每个存放在sqlite数据库中(或者由这个数据库引擎操作)的值都有下面中的一个存储类:●NULL,值是NULL●INTEGER,值是有符号整形,根据值的大小以1,2,3,4,6或8字节存放●REAL,值是浮点型值,以8字节IEEE浮点数存放●TEXT,值是文本字符串,使用数据库编码(UTF-8,UTF-16BE或者UTF-16LE)存放●BLOB,只是一个数据块,完全按照输入存放(即没有准换)从上可以看出存储类比数据类型更一般化。
比如INTEGER存储类,包括6中不同长度的不同整形数据类型,这在磁盘上造成了差异。
但是只要INTEGER值被从磁盘读出进入到内存进行处理,它们被转换成最一般的数据类型(8-字节有符号整形)。
Sqlite v3数据库中的任何列,除了整形主键列,可以用于存储任何一个存储列的值。
sql语句中的中所有值,不管它们是嵌入在sql文本中或者是作为参数绑定到一个预编译的sql语句,它们的存储类型都是未定的。
在下面描述的情况中,数据库引擎会在查询执行过程中在数值(numeric)存储类型(INTEGER和REAL)和TEXT 之间转换值。
1.1布尔类型Sqlite没有单独的布尔存储类型,它使用INTEGER作为存储类型,0为false,1为true1.2 Date和Time DatatypeSqlite没有另外为存储日期和时间设定一个存储类集,内置的sqlite日期和时间函数能够将日期和时间以TEXT,REAL或INTEGER形式存放●TEXT 作为IS08601字符串("YYYY-MM-DD HH:MM:SS.SSS")●REAL 从格林威治时间11月24日,4174 B.C中午以来的天数●INTEGER 从 1970-01-01 00:00:00 UTC以来的秒数程序可以任意选择这几个存储类型去存储日期和时间,并且能够使用内置的日期和时间函数在这些格式间自由转换2.0 类型近似为了使sqlite和其他数据库间的兼容性最大化,sqlite支持列上“类型近似”的观点,列的类型近似指的是存储在列上数据的推荐类型。
这里必须记住一点,这个类型是被推荐,而不是必须的。
任何列仍然能存储任意类型的数据。
只是一些列,给予选择的话,将会相比于其他的一些类型优选选择一些存储类型,这个列优先选择的存储类型被称为它的“近似”。
每个sqlite3数据库中的列都被赋予下面类型近似中的一种:●TEXT●NUMERIC●INTEGER●REAL●NONE具有TEXT近似的列可以用NULL,TEXT或者BLOB类型存储数据。
如果数值数据被插入到具有TEXT近似的列,在被存储前被转换为文本形式一个有NUMERIC近似的列可以使用1中的所有5中存储类来存储数据。
当文本数据被存放到NUMERIC近似的列中,这个文本的存储类被转换到INTEGER或REAL (根据优先级顺序),如果这个转换是无损的话。
对于TEXT和REAL存储类间的转换,如果数据的前15位的被保留的话sqlite就认为这个转换是无损的、可反转的。
如果TEXT到INTEGER或REAL的转换不可避免的会造成损失,那么数据将使用TEXT 存储类存储。
不会企图去转换NULL或BLOB值。
一个字符串可能看起来像浮点数据,有小数点或指数符号,但是只要这个数据可以使用整形存放,NUMERIC近似就会将它转换到整形。
比如,字符串 '3.0e+5'存放到一个具有NUMERIC近似的列中,被存为300000,而不是浮点型值300000.0。
具有INTEGER近似的列和具有NUMERIC近似的列表现相同。
它们之间的差别仅处于转换描述上。
具有REAL近似的列和具有NUMERIC近似的列一样,除了它将整形数据转换成浮点型形式。
具有NONE近似的列不会优先选择一个存储列,也不会强制将数据从一个存储类转换到另外一个类。
2.1 列近似的决定因素列的近似由这个列的声明类型所决定,根据下面的顺序的规则:<1> 如果声明类型包含”INT”字符串,那么这个列被赋予INTEGER近似<2> 如果这个列的声明类型包含”CHAR”,”CLOB”,或者”TEXT”中的任意一个,那么这个列就有了TEXT近似。
注意类型VARCHAR包含了”CHAR”字符串,那么也就被赋予了TEXT近似<3> 如果列的声明类型中包含了字符串”BLOB”或者没有为其声明类型,这个列被赋予NONE近似<4> 其他的情况,列被赋予NUMERIC近似上面规则额顺序对于决定列的近似很重要。
一个列的声明类型为”CHARINT”的话同时会匹配规则<1>和<2>,但是第一个规则占有优先级所以这个列的近似将是INTEGER。
2.2 近似名称例子(numeric和real的数据长度不一样,REAL是浮点型,numeric和decimal一样,好处是可定义长度和小数点后位数 34.421用NUMERIC好.)注意到声明类型为”FLOATING POINT”将被赋予INTEGER近似,而不是REAL近似,因为在”POINT”中的”INT”。
声明类型为”STRING”的将被赋予NUMERIC,而不是TEXT (因为上述表中定义的类型中不存在STRING这一类型,它被归于到规则<4>中,属于其他情况)。
(从上面可以看出,sqlite3只是从声明类型字符串中去查找它知道的声明类型,比如”XINT”将被赋予INTEGER近似因为这个字符串里面有”INT”,所以这里并不需要一个单独的正确的声明类型,而是只要声明类型字符串里面包含了sqlite所知道的声明类型即可)2.3 列近似操作例子CREATE TABLE t1(t TEXT, -- text affinity by rule 2nu NUMERIC, -- numeric affinity by rule 5i INTEGER, -- integer affinity by rule 1r REAL, -- real affinity by rule 4no BLOB -- no affinity by rule 3); //这里根据声明类型确定了列的类型近似INSERT INTO t1 VALUES('500.0', '500.0', '500.0', '500.0', '500.0');SELECT typeof(t), typeof(nu), typeof(i), typeof(r), typeof(no) FROM t1;//结果:text|integer|integer|real|textDELETE FROM t1;INSERT INTO t1 VALUES(500.0, 500.0, 500.0, 500.0, 500.0);SELECT typeof(t), typeof(nu), typeof(i), typeof(r), typeof(no) FROM t1;//结果:text|integer|integer|real|realDELETE FROM t1;INSERT INTO t1 VALUES(500, 500, 500, 500, 500);SELECT typeof(t), typeof(nu), typeof(i), typeof(r), typeof(no) FROM t1;//结果:text|integer|integer|real|integer(这里的第四个值,对应的列是REAL近似的,传输的值整形的,但是根据REAL 近似的规则它会将它转换为real型数据)// 数据块(BLOB)不管是什么列近似都一直存为BLOB类型DELETE FROM t1;INSERT INTO t1 VALUES(x'0500', x'0500', x'0500', x'0500', x'0500');SELECT typeof(t), typeof(nu), typeof(i), typeof(r), typeof(no) FROM t1;//结果:blob|blob|blob|blob|blob// NULLs也不受列近似影响DELETE FROM t1;INSERT INTO t1 VALUES(NULL,NULL,NULL,NULL,NULL);SELECT typeof(t), typeof(nu), typeof(i), typeof(r), typeof(no) FROM t1;//结果:null|null|null|null|null3.0 比较表达式Sqlite v3有一系列有用的比较操作符,包括 "=", "==", "<", "<=", ">", ">=", "!=", "<>", "IN", "NOT IN", "BETWEEN", "IS", 和 "IS NOT"3.1 排序比较操作的结果基于操作数的存储类型,根据下面的规则:●存储类型为NULL的值被认为小于其他任何的值(包括另一个存储类型为NULL的值)●一个INTEGER或REAL值小于任何TEXT或BLOB值。
当一个INTEGER或REAL值与另外一个INTEGER或REAL值比较的话,就执行数值比较●TEXT值小于BLOB值。
当两个TEXT值比较的时候,就根据序列的比较来决定结果●当两个BLOB值比较的时候,使用memcmp来决定结果3.2 比较操作数的近似(Affinity)Sqlite可能在执行一个比较之前会在INTEGER,REAL或TEXT之间转换比较值。