ACID(原子性、一致性、隔离性、持久性)
编译安装
到http://www.sqlite.org/download.html上下载最新的源码:
export STAGING_DIR=xxx/toolchain/allwinner_t113/
autoreconf -ivf
./configure --host=arm-linux-gnu --prefix=$(pwd)/tmp/ CC=$(pwd)/xxx/allwinner_t113/bin/arm-openwrt-linux-gcc CFLAGS="-Os" --enable-static=no
make
make install
另外附上一个RISC-V在FreeRTOS编译静态库的例子:
autoreconf -ivf
#对于需要配置工具链和特殊配置的,可以查看./configure --help帮助,比如,使用risc-v工具链编译FreeRTOS上使用的libsqlite.a,并且去除调试信息,可以有如下配置:
./configure --host=riscv64-unknow-gnu --prefix=xxx --enable-shared=no CC=xxx CFLAGS='-DSQLITE_THREADSAFE=0 -DSQLITE_OS_OTHER=1 -DSQLITE_OMIT_WAL=1'
make
make install
复制动态库和头文件到交叉编译工具链:
sudo cp -rf ./include/ /opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/sys-root/usr/include
sudo cp -drf ./lib/* /opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/sys-root/usr/lib
复制动态库和可执行程序到开发板文件系统:
cp -d ./lib/so /mnt/rootfs/lib/
cp ./bin/* /mnt/rootfs/bin/
sqlite test.db "select * from t;"仅执行(直接交付给sqlite库)双引号中的命令之后返回,后面可以接管道处理
sqlite的命令以“;”作为结束,“/”和“GO”都可以
sqlite进入脚本交互模式
交互模式期间,如果secureCRT中不能使用退格和方向键等命令,可以在退出sqlite之后,终端中输入 “stty erase ^H”解决
自带的sqlite3脚本常用命令
select * from xxx; 查询某个表的所有记录
.help 查看帮助
.quit/.exit 退出sqlite3
.header on/off 可以使能或者关闭表头的显示
.mode xxx 可以切换显示模式,包括list(默认),line,column,instert,json,box等,其中column是列形式排列输出,line是逐行输出表中的记录,markdwon和box可以严格按照表格格式输出,json是让查询输出用json输出
.mode insert xxx(表名) 可以将所有的查询输出结果,变为标准的SQL插入语句,方便导入其他数据库(一个表中的多条记录)
.output filename 输出到文件
.indices 创建索引
.schema 生成创建表(DDL)的语句,方便导入其他数据库
.database 显示当前打开的数据库
.dump 直接产生整个数据库的ASCI创建语句
.explain 进入sql语句调优模式,explain slect * from t 分析执行
.timeout 访问数据库中一个表的时候,如果这个表格被锁(占用),等待超时时间
shell的应用:
#/bin/sh
sqlite3 test.db << EOF
create table t (id int, name char);
insert into t values (1, 'wang');
insert into t values (2, 'ye');
insert into t values (3, 'kai');
EOF
其中“<< XXX ... XXX”是here document,XXX可以是任何成对的字符
使用C语言访问sqlite:
#include <sqlite3.h>
sqlite3_open() 打开数据库
sqlite3_exec() 执行命令,可以设置完成回到函数
sqlite3_free() 命令执行失败后,用于释放数据库
sqlite3_errmsg() 分析错误信息
sqlite3_close() 关闭数据库
支持的数据类型
对于Mysql,它支持的数据类型:
整数型:
TINYINT (1B)
SMALLINT (2B)
MEDIUMINT (3B)
INT (4B)
BIGINT (8B)
浮点型:
FLOAT (4B)
DOUBLE (8B)
字符型:
CHAR (0~255B)
VARCHAR (0~255B)
TINYBLOB (0~255B)
TINYTEXT (0~255B)
BLOB (0~65535B)
TEXT (0~65535B)
MEDIUMBLOB (0~16777215B)
MEDIUMTEXT (0~16777215B)
LONGBLOB (0~4294967295B)
LONGTEXT (0~4294967295B)
时间日期:
DATE (3B)
TIME (3B)
YEAR (1B)
TIMESTAMP (8B)
DATETIME (8B)
复合类型:
ENUM
SET
对于SQLite,数据类型并没有像其他的数据库一样使用固定类型进行限定,而是使用一种动态的策略,通过给每个列定义一个比较泛的数据类型,具体根据每列数据的长度大小,最终决定使用什么数据类型进行存储,以此增强存储效率。
这五大类型为:
NULL. The value is a NULL value.
INTEGER. The value is a signed integer, stored in 1, 2, 3, 4, 6, or 8 bytes depending on the magnitude of the value.
REAL. The value is a floating point value, stored as an 8-byte IEEE floating point number.
TEXT. The value is a text string, stored using the database encoding (UTF-8, UTF-16BE or UTF-16LE).
BLOB. The value is a blob of data, stored exactly as it was input.
由于在磁盘上的存储格式各异,所以当进行处理的时候,加载到内存的过程中是需要进行转换,例如INT被统一转换为8B。
sqlite没有专门用于存储Bool、时间、日期的数据类型,使用INT、REAL或者TEXT替换,例如使用current_date、current_time、current_timestamp关键字。
另外sqlite并不支持VARCHAR(100)这样的括号限制数据长度的命令,会被自动忽略。
对于SQLite一个比较特殊的地方在于,一个字段可能包含不同的存储类型,大小排序根据内定的一套规则进行:
NULL < REAL/INTERGER<TEXT < BLOB