NULL、INTEGER、REAL、TEXT、BLOB
但是,sqlite3也支持如下的数据类型
smallint 16位整数
integer 32位整数
decimal(p,s) p是精确值,s是小数位数
float 32位实数
double 64位实数
char(n)n长度字符串,不能超过254
varchar(n) 长度不固定最大字符串长度为n,n不超过4000
graphic(n) 和 char(n) 一样,但是单位是两个字符double-bytes,n不超过127(中文字)
vargraphic(n) 可变长度且最大长度为n
date 包含了年份、月份、日期
time 包含了小时、分钟、秒
timestamp 包含了年、月、日、时、分、秒、千分之一秒
sqlite3支持的函数
【1】日期函数
datetime(): 产生日期和时间
date(): 产生日期
time():产生时间
strftime():对以上3个函数产生的日期和时间进行格式化
用法实例:
1、SELECT date('2011-9-9','+1 day','+1 year'); 结果是 2010-09-10
2、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每查到一条记录,就调用一次这个回调
- intLoadMyInfo(void*para,intn_column,87); background-color:inherit; font-weight:bold">char**column_value,87); background-color:inherit; font-weight:bold">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");
- return0;
- }
- intmain(int,87); background-color:inherit; font-weight:bold">char**)
- sqlite3*db;
- intresult;
- char*errmsg=NULL;
- charsql[512];
- result=sqlite3_open("My.db",&db);
- if(result!=sqlITE_OK)
- //数据库打开失败
- return-1;
- //创建数据表
- strcpy(sql,"CREATETABLEtest(IDINTEGERPRIMARYKEY,NAMEVARCHAR(32));");
- result=sqlite3_exec(db,sql,NULL,errmsg);
- if(result!=sqlITE_OK)
- printf("创建表失败,错误:%s\n",errmsg);
- //插入记录
- "INSERTINTOtestVALUES(1,'OK');");
- printf("插入记录失败,错误:%s\n",0); background-color:inherit">//查询数据库
- "SELECT*FROMtest;");
- sqlite3_close(db);
- return0;
- }
以上是通过回调查询数据库,如果该函数在C++中,就要将其声明成static类型,因为C++
成员函数隐藏了一个参数:this,C++调用类的成员函数的时候,隐含把类指针当函数的第
一个参数传递进去,就与上面的sqlite回调函数参数不符
除了使用回调来查询,还可以使用非回调的查询,通过sqlite3_get_table函数做到
int sqlite3_get_table(sqlite3*,char ***resultp,int *nrow,int *ncolumn,char **errmsg);
参数3:resultp 是一维数组,第一行是字段名称,跟着是每个字段的值
参数4:查询共多少条记录
参数5:查询共多少个字段
操作实例如下: