SQLite的BLOB数据类型与C++二进制存储学习记录

一、BLOB数据类型简介

        Blob(Binary Large Object)是一种用于存储二进制数据的数据类型,在数据库中常用于存储图片、音频和视频等大型(大数据量)的二进制数据[1-2]。需要注意的是,SQLite中BLOB类型的单对象最大存储字节数由预处理器宏SQLITE_MAX_LENGTH定义并可以提高或降低该值,但是当前的实现只支持最大长度为2^{31}-1字节。

        在SQLite的部分INSERT和SELECT语句处理过程中,数据库中每一行的完整内容被编码为单个BLOB数据类型对象,所以SQLITE_MAX_LENGTH宏定义决定了数据库中一行的最大字节数[3]

二、C++标准库之bitset简介[4-6]

       C++标准库中的bitset库,是一个模板类(模板参数定义了位集合的大小)且提供了一种方式来操作固定大小的位集合。位集合是一个由位(bit)组成的数组,每个位可以是0或1,因此bitset类型非常适合于需要表示二进制数据或进行位操作的场景。

        位运算的优势在于可以大量减少运行开销,优化算法。其运算速度快的原因是直接使用计算机底层的二进制机器操作指令。较为详细的位运算理论理解与实际用例可参考资料[6]。

二、C++中基本数据类型实例与其二进制存储形式探索[7-10]

        计算机中的所有数据,无论是文本、图像、音频还是视频,最终都会被转换为二进制形式进行存储和处理。比特/位(bit)是计算机内存中的最小/原子单位,也是数据传输的最小单位;字节(Byte)是计算机系统中最小的存储单位,是计算机记忆体(memory)存储资料的基本单位,每个字节由八个比特位组成。

       C++基本内置数据类型在计算机内部存储数据时使用二进制,但在向用户显示时使用八进制、十进制与十六进制等进制。需要注意的是,整数类型是按照二进制补码的方式来存储数值(非负整数直接使用二进制表示,无符号位),其最高位(最左边一位)用于表示符号(0表示正数,1表示负数),剩下的位数表示数值部分;浮点数类型是按照IEEE 754标准来存储数据,然后根据浮点数数值转换公式进行数值计算。详细叙述可参考资料[7]。

        计算机中的字符按照字符集编码表示,常见的字符集编码有ASCII编码、ANSI编码、Unicode编码以及UTF-8编码。其中,ASCII码(American Standard Code for Information Interchange,美国信息交换标准码),一个英文字母(不分大小写)占一个字节的空间。ASCII码字符代码表可参考资料[10]。

        (一)实验一 基于字符串的逐字符二进制编码转换

        (二)实验二 长整型向量的逐一元素二进制编码转换

        (三)实验三 字符型向量的逐一元素二进制编码转换

实验总结:

1. C++基本内置数据类型在计算机内部存储数据时使用二进制;

2. 基于标准库bitset可以将存储数据以二进制的形式显化展示;

3. 字符类型(char)占一个字节,其不仅可以基于ASCII码存储字符,还可以在单字节限制下存储有限大小的整型数据(实质上,char与int之间存在隐式转换)。

三、基于SQLite实现图像数据库管理(图像的存取实例)[11-12]

        该示例代码仅实现了图像数据的数据库/表创建及数据插入,未实现数据库图像的读取与二进制码解析。数据库图像的读取与二进制码解析概要代码可参考资料[12]。

#include <iostream>
#include <string>
#include <vector>
#include "opencv2/opencv.hpp"
#include "sqlite3.h"using namespace std;// 实验数据
string imagePath = "./icon.jpg";int main()
{// 读取图像文件并检查图像是否读取成功cv::Mat image = cv::imread(imagePath);if (image.empty()) {cout << "无法读取图像文件。" << endl;return -1;}// 创建图像存储表/*图像存储表设计(该表包含"id"、"name"、"size"、"type"、"data"五个字段):1. "id"字段作为主键,自动递增;2. "name"字段用于存储图像的名称;3. "size"字段用于存储图像的大小(以字节为单位);4. "type"用于存储图像的类型(如.jpg和.png等);5. "data"字段为BLOB类型,用于存储图像的二进制类型*/sqlite3* db;int rc = sqlite3_open("./imageDB.db", &db);if (rc){std::cerr << "无法打开数据库: " << sqlite3_errmsg(db) << std::endl;return 1;}else{std::cout << "数据库打开成功" << std::endl;}// 创建数据库表char* errMsg = 0;const char* sql = "CREATE TABLE IF NOT EXISTS images""(id INTEGER PRIMARY KEY AUTOINCREMENT,""name TEXT NOT NULL,""size INTEGER NOT NULL,""type TEXT NOT NULL,""data BLOB);";rc = sqlite3_exec(db, sql, 0, 0, &errMsg);if (rc != SQLITE_OK){std::cerr << "SQL错误: " << errMsg << std::endl;sqlite3_free(errMsg);sqlite3_close(db);return -1;}else{std::cout << "表创建成功" << std::endl;}// 处理图像数据(将图像数据转换为二进制数据)vector<uchar> buffer;cv::imencode(".jpg", image, buffer);  // 该函数将图像以设定图片格式编码存储到buffer// 该函数将图像数据编码转换为指定格式的字节流,这个字节流本质上就是二进制数据size_t size = sizeof(buffer);uchar* dataPtr = buffer.data();// 基于参数化方式将图像数据存入表/*参数化方式的原理:参数化将SQL语句的结构与数据分开。SQL语句中的参数位置用?占位符表示,然后通过专门的绑定函数将实际数据绑定到这些占位符上。参数化方式的优势:这样可以有效避免SQL注入攻击。因为SQL语句的语法结构是固定的,用户输入的数据不会被解释为SQL语法的一部分*/const char* sql1 = "INSERT INTO images (id,name,size,type,data)""VALUES (?, ?, ?, ?, ?);";sqlite3_stmt* stmt;int rc1 = sqlite3_prepare_v2(db, sql1, -1, &stmt, nullptr);if (rc1 != SQLITE_OK) {std::cerr << "准备插入语句出错: " << sqlite3_errmsg(db) << std::endl;sqlite3_close(db);return -1;}sqlite3_bind_int(stmt, 1, 0);sqlite3_bind_text(stmt, 2, "icon", -1, SQLITE_TRANSIENT);sqlite3_bind_int(stmt, 3, size);sqlite3_bind_text(stmt, 4, "jpg", -1, SQLITE_TRANSIENT);sqlite3_bind_blob(stmt, 5, dataPtr, -1, SQLITE_TRANSIENT);int rc2 = sqlite3_step(stmt);if (rc2 != SQLITE_DONE) {std::cerr << "执行插入语句出错: " << sqlite3_errmsg(db) << std::endl;}cout << "图像数据插入成功" << endl;sqlite3_finalize(stmt);return 0;
}

参考资料:

[1] Datatypes In SQLite

[2] SQLite Blob 数据类型详解|极客笔记 (deepinout.com)

[3] SQLite 的实现限制 | SQLite中文网 (readdevdocs.com)

[4] C++ 数据类型 | 菜鸟教程 (runoob.com)

[5] C++之std::bitset使用精讲(全)-CSDN博客

[6] 位运算的运用场景使用总结_位运算的使用场景-CSDN博客

[7] C++内置数据类型与二进制存储 | 我有昕想法 | Peter_Matthew的博客 (zhangkai.xin)

[8] 计算机科学导论:第三章 数据存储 - 知乎 (zhihu.com)

[9] 在 C++ 中将字符串转换为二进制序列 | D栈 - Delft Stack

[10] ASCII 表 | 菜鸟教程 (runoob.com)

[11] SQLite 数据库中插入和读取 BLOB 数据|极客笔记 (deepinout.com)

[12] SQLite 如何在SQLite数据库中存储图像|极客教程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/467383.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python基础——05函数

一、函数 1.1 函数定义 函数定义&#xff1a;实现特定功能的代码块 函数的作用&#xff1a; 简化代码提高代码重用性便于维护和修改可提高代码的可拓展性 函数三要素&#xff1a;功能、参数、返回值 函数定义的语法格式&#xff1a; 函数分类&#xff1a; 从定义的角度—…

[Redis] Redis哨兵机制

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

【Eclipse系列】eclipse安装与常规配置(含插件)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 一、下载与安装 二、常规设置 1.1.设置工作空间(workspace) 1.2.设置字体和字体大小 ​编辑 1.3.设置编码 1.4.去除验证(validation) 1.5.去除单词验证(spelli…

注册登录学生管理系统小项目

头文件 #ifndef _LOGINLINK_H_ #define _LOGINLINK_H_ #include<myhead.h> typedef struct {int id;char name[20];int age; }stu,*Pstu; typedef struct node {union{int len;stu data;};struct node *next; }node,*Pnode; int regist(); int login(); Pnode create()…

【在clion中构建python interpreter环境用于debug fastlio2】

在CLION中构建python interpreter环境 数据包在clion中构建python interpreter环境 数据包 数据包链接&#xff1a;fastlio2_ros2 在clion中构建python interpreter环境 通过clion中的remote development 通过SSH远程构建fastlio2 workspace 打开远程clion工作空间后&#x…

HTML+CSS基础【快速上手】

目录 一、HTML展示 1、HTML基础结构 2、认识元素属性 &#xff08;1&#xff09;元素属性理解 &#xff08;2&#xff09;实例 3、自结束标签和注释 &#xff08;1&#xff09;自结束标签 &#xff08;2&#xff09;注释 4、语义化标签 &#xff08;1&#xff09;语义…

6000字加图文 | 抓包带你深入了解网关到底起什么样的作用?不同网段通信的过程详解

不同网段通信的过程 不同网段就分两种了&#xff0c;同一个局域网下面&#xff0c;不同网段之间的通信&#xff0c;或者是从局域网去往互联网的通信&#xff0c;那么这个过程又是怎么样的呢&#xff1f; 还记得第二篇这个内容吗&#xff0c;访问者把数据交给网关&#xff0c;当…

Gpt4.0最新保姆级教程开通升级

如何使用 WildCard 服务注册 Claude3 随着 Claude3 的震撼发布&#xff0c;最强 AI 模型的桂冠已不再由 GPT-4 独揽。Claude3 推出了三个备受瞩目的模型&#xff1a;Claude 3 Haiku、Claude 3 Sonnet 以及 Claude 3 Opus&#xff0c;每个模型都展现了卓越的性能与特色。其中&a…

Python毕业设计选题:基于django+vue的网上购物系统的设计与实现

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 管理员登录 管理员功能界面 用户管理 商品类型管理 商品信息管理 系统管理 订单管理…

uniapp组件实现省市区三级联动选择

1.导入插件 先将uni-data-picker组件导入我们的HBuilder项目中&#xff0c;在DCloud插件市场搜索uni-data-picker 点击下载插件并导入到我们的项目中 2.组件调用 curLocation &#xff1a;获取到的当前位置&#xff08;省市区&#xff09; <uni-data-picker v-slot:defa…

关于Flutter空安全升级方案整理

前言 Flutter 从 2.0 版本开始支持空安全&#xff08;Null Safety&#xff09;。dart 版本为&#xff1a; environment:sdk: ">2.12.0 < 3.0.0"升级到空安全后&#xff0c;由于语法的变动&#xff0c;基本上整个工程&#xff0c;代码都爆红&#xff0c;这对项…

免费送源码:Java+ssm+MySQL ssm家电售后服务 计算机毕业设计原创定制

摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对家电售后服务等问题&#xff0c;对家电售后…

共享汽车管理新纪元:SpringBoot框架应用

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…

yaml文件编写

Kubernetes 支持YAML和JSON格式管理资源 JSON 格式:主要用于 api 接口之间消息的传递 YAML 格式;用于配置和管理,YAML是一种简洁的非标记性语言,内容格式人性化容易读懂 一&#xff0c;yaml语法格式 1.1 基本语法规则 使用空格进行缩进&#xff08;不使用制表符&#xff0…

ssm071北京集联软件科技有限公司信息管理系统+jsp(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;北京集联软件科技有限公司信息管理系统 \ 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本信息…

满足大众需求的理想选择:1000平米气膜羽毛球馆—轻空间

随着全民健身热潮的兴起和羽毛球运动的广泛普及&#xff0c;越来越多的企事业单位、学校以及社区开始寻求适合的大型羽毛球场地。对于大众需求者而言&#xff0c;如何在有限的预算和时间内建设一个高效且灵活的羽毛球馆&#xff1f;1000平米气膜羽毛球馆正是应运而生的理想解决…

原生鸿蒙应用市场:赋能开发者全生命周期服务体验

文章目录 背景自动化检测前移&#xff1a;早发现&#xff0c;早解决技术细节&#xff1a;静态代码分析与兼容性测试应用场景 按需加载&#xff1a;优化性能&#xff0c;提升用户体验技术细节&#xff1a;模块化与懒加载实现应用场景 应用加密&#xff1a;保护应用代码安全&…

vue3组合式API下封装hooks使用生命周期,在await之后调用hooks会有警告

起因&#xff1a;想封装一个hooks实现echarts图表随屏幕大小resize并且组件销毁时移除监听。结果在组件里面调用这个hooks&#xff0c;有个告警提示 [Vue warn]: onBeforeUnmount is called when there is no active component instance to be associated with. Lifecycle inje…

wget命令之Tomcat(三)

引言 Tomcat是一个开源的Java Web应用服务器&#xff0c;实现了多个关键的Java EE规范&#xff0c;包括Servlet、JSP&#xff08;JavaServer Pages&#xff09;、JavaWebSocket等。由于Tomcat技术先进、性能稳定且免费&#xff0c;它成为了许多企业和开发者的首选Web应用服务器…

【机器学习】决定系数(R²:Coefficient of Determination)

决定系数&#xff0c;也称为 R 平方&#xff0c;是一种用于衡量回归模型预测效果的统计指标。它表示了模型解释目标变量总变异的程度&#xff0c;数值介于 0 和 1 之间&#xff0c;数值越接近 1 表明模型的解释力越强。 1. 的定义和公式 的公式如下&#xff1a; 其中&#xf…