在日常开发中,经常需要跟数据库打交道,本文主要讨论sqlite3本地型数据库。
sqlite数据类型介绍
在进行数据库Sql操作之前,首先有个问题需要说明,就是Sqlite的数据类型,和其他的数据库不同,Sqlite支持的数据类型有他自己的特色,这个特色有时会被认为是一个潜在的缺点,但是这个问题并不在我们的讨论范围之内。
大多数的数据库在数据类型上都有严格的限制,在建立表的时候,每一列都必须制定一个数据类型,只有符合该数据类型的数据可以被保存在这一列当中。而在 Sqlite 2.X中,数据类型这个属性只属于数据本生,而不和数据被存在哪一列有关,也就是说数据的类型并不受数据列限制(有一个例外:INTEGER PRIMARY KEY,该列只能存整型数据)。
但是当Sqlite进入到3.0版本的时候,这个问题似乎又有了新的答案,Sqlite的开发者开始限制这种无类型的使用,在3.0版本当中,每一列开始 拥有自己的类型,并且在数据存入该列的时候,数据库会试图把数据的类型向该类型转换,然后以转换之后的类型存储。当然,如果转换被认为是不可行 的,Sqlite仍然会存储这个数据,就像他的前任版本一样。
举个例子,如果你企图向一个INTEGER类型的列中插入一个字符串,Sqlite会检查这个字符串是否有整型数据的特征, 如果有而且可以被数据库所识别,那么该字符串会被转换成整型再保存,如果不行,则还是作为整型存储。
总的来说,所有存在Sqlite 3.0版本当中的数据都拥有以下之一的数据类型:
空(NULL):该值为空
整型(INTEGEER):有符号整数,按大小被存储成1,2,3,4,6或8字节。
实数(REAL):浮点数,以8字节指数形式存储。
文本(TEXT):字符串,以数据库编码方式存储(UTF-8, UTF-16BE 或者 UTF-16-LE)。
BLOB:BLOB数据不做任何转换,以输入形式存储。
ps: 在关系数据库中,CLOB和BLOB类型被用来存放大对象。BOLB表示二进制大对象,这种数据类型通过用来保存图片,图象,视频等。CLOB表示字符大对象,能够存放大量基于字符的数据。
什么是BLOB数据
BLOB (binary large object)即二进制大对象,是一种可以存储二进制文件的容器。在计算机中,BLOB常常是数据库中用来存储二进制文件的字段类型。常见的BLOB文件有图片、声音和自定义对象等。
在日常开发中,有时会遇到二维数组和结构体等数据类型的变量,如果想要通过一张表中的一个字段来存取该变量,如何做到整存整取,尽可能提高数据库的存取效率,下面我做个简单的讨论:
1)通过json序列化转换成json字符串;可先将结构体中的变量依次转化成json的数据对象。
2)将结构体或二维数组的元素拼成 char*后存入;
3)利用sqlite3中的api操作blob类型字段(即将结构体看成blob类型)
通过比较,我们可以发现方法3是最简单操作的,能够高效地实现整存整取,且存取之前各不需要做相应的处理,法1需要存储之前的组包操作,读取后还需要做相应的解析;法2存入后读取时很难再拆分成每个字段。
通过上述分析,最终采用了法3,具体的插入与查询操作可参考如下:
BLOB数据的插入与查询
最后,推荐几篇比较好的博文:
sqlite3的图片的(二进制数据)存取操作
SQLite学习笔记(八)-- BLOB数据的插入与查询(C++实现)
欢迎有其他思路的人一起探讨~