c++ - SQLite 不存储包含\0 字节的 blob

标签 c++ sqlite blob

使用C/C++接口(interface)将二进制数据插入sqlite数据库:

  // Previously: "create table tt(i integer primary key, b blob)"
  sqlite3 *sqliteDB;
  if(sqlite3_open("example.db", &sqliteDB) == 0)
    {

    // "insert" statement
    const char *sqlText = "insert into tt (i,b) values (?,?)";
    sqlite3_stmt *preparedStatement;
    sqlite3_prepare_v2(sqliteDB, sqlText, (int)strlen(sqlText), &preparedStatement, 0);

    // add the number
    sqlite3_bind_int(preparedStatement, 1, 1);

    // add the data
    char myBlobData[] = "He\0llo world"; // sizeof(myBlobData) is 13 bytes
    sqlite3_bind_blob(preparedStatement, 2, myBlobData, sizeof(myBlobData), 0); // returns SQLITE_OK

    // store in database
    sqlite3_step(preparedStatement); // returns SQLITE_DONE

    sqlite3_close(sqliteDB);
    }

这会存储一个包含“He”的 2 字节 blob,而不是要求存储的 13 字节 blob。为什么?

它似乎以第一个 0 字节结束,但 blob 不是字符串(因此需要 sqlite3_bind_blob 的大小参数),那么为什么它将任意二进制数据视为 C 样式字符串?

最佳答案

如何从数据库中获取 BLOB?那时它可能会被截断;也许您的代码在提取后将其视为字符串。

您可以通过 BLOB API 检查实际的 BLOB 大小。 sqlite3_blob_open(),然后调用 sqlite3_blob_bytes()。

关于c++ - SQLite 不存储包含\0 字节的 blob,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13825164/

相关文章:

c++ - 'return' 可以在 C 中返回多个值吗?

c++ - 如何识别项目是托管c++项目还是非托管c++项目

c++ - 如何以通用方式交换两个值?

mysql - 将 SQLite3 迁移到 MySQL 的快速简单方法?

sql - 无法从 BLOB 存储打开备份设备 - 访问被拒绝

c++ - 在 C++ 中为 Message Pump 定义自己的 WM 消息

database - 从 sqlite3 数据库中删除旧数据的脚本

ios - Sqlite 数据库不存在这样的表

javascript - 为什么 Blob of Array 比 Blob of Uint8Array 小?

mysql - Symfony 显示 blob 值