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

sqlite 使用: 03-问题记录:在使用 sqlite3_bind_text 中设置 SQLITE_STATIC 参数时,处理不当造成的字符乱码

用通义千问生成了一个测试代码,发现存入的文本为乱码,记录下问题与解决方式。

1.问题背景:

以下为问题代码片段,主要看 sqlite3_bind_text 调用文本传参的这一句即可:

//saveTimer 的实现
bool DatabaseManager::saveTimer(const Timer& timer) {const char* insertSQL = R"(INSERT INTO timers (name, description, expire_time, status)VALUES (?, ?, ?, ?);)";sqlite3_stmt* stmt;int rc = sqlite3_prepare_v2(db_, insertSQL, -1, &stmt, NULL);if (rc != SQLITE_OK) {std::cerr << "Failed to prepare statement: " << sqlite3_errmsg(db_) << std::endl;return false;}/* 问题代码部分,SQLITE_STATIC ,timer.getName() 返回的是一个临时变量,语句执行完成就销毁了,就会出问题 */sqlite3_bind_text(stmt, 1, timer.getName().c_str(), -1, SQLITE_STATIC);sqlite3_bind_text(stmt, 2, timer.getDescription().c_str(), -1, SQLITE_STATIC);std::string timeStr = timePointToString(timer.getExpireTime());sqlite3_bind_text(stmt, 3, timeStr.c_str(), -1, SQLITE_STATIC);sqlite3_bind_int(stmt, 4, static_cast<int>(timer.getStatus()));rc = sqlite3_step(stmt);sqlite3_finalize(stmt);return rc == SQLITE_DONE;
}

2.问题原因与解决

timer.getName()等方法返回的都是临时变量,语句执行完成就销毁了。sqlite3_bind_text传入的指针
变成了野指针,这会导致数据库文件中的名称和描述为以乱码的形式存在。

需要修改将 SQLITE_STATIC 改为 SQLITE_TRANSIENT。
这两个参数的区别是:

  • SQLITE_STATIC:告诉 SQLite 字符串指针在 SQLite 使用期间不会改变,SQLite 不会复制数据
  • SQLITE_TRANSIENT:告诉 SQLite 需要复制数据,因为原始数据可能在 SQLite 使用完之前被释放或修改。
bool DatabaseManager::saveTimer(const Timer& timer) {const char* insertSQL = R"(INSERT INTO timers (name, description, expire_time, status)VALUES (?, ?, ?, ?);)";sqlite3_stmt* stmt;int rc = sqlite3_prepare_v2(db_, insertSQL, -1, &stmt, NULL);if (rc != SQLITE_OK) {std::cerr << "Failed to prepare statement: " << sqlite3_errmsg(db_) << std::endl;return false;}/*修改传入的参数为 SQLITE_TRANSIENT*/sqlite3_bind_text(stmt, 1, timer.getName().c_str(), -1, SQLITE_TRANSIENT);sqlite3_bind_text(stmt, 2, timer.getDescription().c_str(), -1, SQLITE_TRANSIENT);std::string timeStr = timePointToString(timer.getExpireTime());sqlite3_bind_text(stmt, 3, timeStr.c_str(), -1, SQLITE_TRANSIENT);sqlite3_bind_int(stmt, 4, static_cast<int>(timer.getStatus()));rc = sqlite3_step(stmt);sqlite3_finalize(stmt);return rc == SQLITE_DONE;
}
http://www.dtcms.com/a/469981.html

相关文章:

  • 网站建设与维护难不难为什么找别人做网站
  • 广州木马网站建设公司医院门户网站建设规划
  • 大模型学习之 深入理解编码器与解码器
  • pyqt 触摸屏监听
  • C++ Primer Plus 第六版 第十三章 编程题
  • 大模型前世今生(十二):Hessian矩阵
  • 蛙跳积分法:分子动力学模拟中的高效数值积分技术
  • 详解 SNMPv1 与 SNMPv2 Trap 格式
  • 书法网站建设成都微信公众号制作
  • 宜春网站制作公司wordpress图片上传慢
  • Python串口通信与MQTT物联网网关:连接STM32与物联网平台
  • MyLanViewer(局域网IP扫描软件)
  • 湛江专业建站推荐40平米小户型装修效果图
  • 147.《手写实现 Promise.all 与 Promise.race》
  • 【HarmonyOS】异步并发和多线程并发
  • 使用docker 安装dragonfly带配置文件(x86和arm)版本
  • 企业信息型网站有哪些网站建设塞西
  • 怎么看网站是什么程序做的益阳网络
  • SpringBoot通过配置类替换配置文件配置
  • 使用Customplot绘制时间-数据曲线
  • **量子算法:探索未来的发散创新之路**随着信息技术的飞速发展,量子计算作为
  • 4. 手写数字识别,推理,批处理
  • AI编程时代的文档困境与破局之道:从Cursor到完整开发体系
  • DVWA靶场之十八:API 安全(API Security)
  • ORB_SLAM2原理及代码解析:Optimizer::LocalBundleAdjustment
  • 中文wordpress站点wordpress 获取路径
  • 从零搭建 Kubernetes 1.28 高可用集群
  • 网站建设有什么岗位职责唐山广告设计制作公司
  • Apache Doris 内部数据裁剪与过滤机制的实现原理 | Deep Dive
  • 长沙百度网站建设专精特新中小企业