当前位置: 首页 > news >正文

【sqlite】一条简单插入的页面变化

c++代码如下:

#include <stdio.h>
#include "sqlite3.h"int main() {sqlite3* db;char* err_msg = NULL;int rc;// 删除之前的测试数据库(如果存在)remove("int.db");// 打开数据库连接rc = sqlite3_open("int.db", &db);if (rc != SQLITE_OK) {fprintf(stderr, "无法打开数据库: %s\n", sqlite3_errmsg(db));return 1;}printf("1. 数据库连接已建立\n");// 创建测试表const char* create_table_sql ="CREATE TABLE test_ints (""tiny INT,""small INT, ""medium INT,""large INT,""negative INT"")";rc = sqlite3_exec(db, create_table_sql, NULL, NULL, &err_msg);if (rc != SQLITE_OK) {fprintf(stderr, "创建表失败: %s\n", err_msg);sqlite3_free(err_msg);return 1;}printf("2. 测试表已创建\n");// 开始一个事务(显式开始)rc = sqlite3_exec(db, "BEGIN TRANSACTION;", NULL, NULL, &err_msg);if (rc != SQLITE_OK) {fprintf(stderr, "开始事务失败: %s\n", err_msg);sqlite3_free(err_msg);return 1;}printf("3. 事务已开始\n");// 插入数据但不提交const char* insert_sql ="INSERT INTO test_ints VALUES (1, 128, 32768, 2147483647, -1);""INSERT INTO test_ints VALUES (127, 255, 65535, 4294967295, -128);""INSERT INTO test_ints VALUES (0, 16384, 1000000, 1000000000, -32768);";rc = sqlite3_exec(db, insert_sql, NULL, NULL, &err_msg);if (rc != SQLITE_OK) {fprintf(stderr, "插入数据失败: %s\n", err_msg);sqlite3_free(err_msg);return 1;}printf("4. 数据已插入但未提交\n");// 提交事务rc = sqlite3_exec(db, "COMMIT;", NULL, NULL, &err_msg);if (rc != SQLITE_OK) {fprintf(stderr, "提交事务失败: %s\n", err_msg);sqlite3_free(err_msg);}else {printf("\n6. 事务已提交\n");}sqlite3_close(db);return 0;
}

运行后,int.db总共有2个页面。第2个页面的末尾有如下数据:

00 00 00 00 00 00 11 03 06 08 02 03 04 02 40 00
0F 42 40 3B 9A CA 00 80 00 13 02 06 01 02 03 05
01 7F 00 FF 00 FF FF 00 00 FF FF FF FF 80 10 01
06 09 02 03 04 01 00 80 00 80 00 7F FF FF FF FF

分析如下:

00 00 00 00 00 00
(第三条)
11 03 06 08 02 03 04 02
40 00 (16384)
0F 42 40 (1000000)
3B 9A CA 00 (1000000000)
80 00 (-32768)
(第二条)
13 02 06 01 02 03 05 01
7F 00 (127)
FF 00 (255)
FF FF 00 00 (65535)
FF FF FF FF (4294967295)
80 (-128)
(第一条)
10 01 06 09 02 03 04
01 (1)
80 (128)
00 80 00 (32768)
7F FF FF FF (2147483647)
FF (-1)

每一条的最前面是1字节的nPayload和6字节的Hdr(头部)。
nPayload等于nByte + nZero(自动补零的数量),这里后者为0,前者则等于nHdr+nData。

这3条的nHdr都是6。

nData则分别是10、13、11.相加最终就得到了16, 19, 17。

详见操作符MakeRecord,

uunData
<=127(哪怕为负)为0则直接不加,否则+=1
<=32767(哪怕为负)+=2
<=8388607(哪怕为负)+=3
<=2147483647(哪怕为负)+=4
<=140737488355327LL(哪怕为负)+=6
else+=8

这里我注意到插入-32768的时候uu是按照32767计算的,而插入-128的时候依旧是-128。暂不清楚原因。

http://www.dtcms.com/a/467504.html

相关文章:

  • 网站开发人员的水平wordpress tag伪静态规则
  • 浙江住建局官方网站网店推广费用多少钱
  • 如何做网站的后台友情链接交换条件
  • Spring 原理
  • openharmony之预置应用配置与安装命令
  • Python生产环境构建
  • 北京网站建设w亿玛酷1专注关于加强公司网站建设的通知
  • 珠海网站制作渠道电商推广和网络推广的策略
  • 旅游网站建设案例分析镇江公交优化
  • 用everything实现从主机下载资源
  • 网站开发与维护好找工作吗wordpress分类目录添加图片
  • 深入了解 IDS/IPS/IDP:概念、问题与应对策略
  • 珠海企业建站西宁软件网站建设
  • 什么网站可以做动画报名系统网站开发
  • 杭州富阳建设局网站女孩子做室内设计累吗
  • flash做网站步骤最近中文字幕2018免费版2019
  • 个人网站可以做推广不dedecms做的网站手机上看图片变形
  • 江苏住房建设厅网站温州建设集团招聘信息网站
  • 【iOS】KVC总结
  • 湖北省建设厅投标报名官方网站企业产品做哪个网站推广好
  • stable-diffusion试验1-静态人物
  • 信息网站建设费使用年限望野王
  • C++ 中 std::numeric_limits使用详解
  • 爱网站无法登录怎么回事seo网络优化公司
  • 思睿鸿途北京网站建设网页设计模板素材网站
  • Google 智能体设计模式:反思
  • 网页设计与网站建设实训目的装修平台app
  • dede无法更新网站主页到asp.net网站开发典型模块与实例精讲
  • [嵌入式系统-90]:GPU是一个以极致并行计算为目标的专用加速器芯片,其特点是拥有海量轻量级处理单元和高带宽内存系统,用于执行高度规则的数据并行任务。
  • 类和对象的创建