2

使用 C/C++ 接口将二进制数据插入 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 样式字符串?

4

1 回答 1

2

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

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

于 2012-12-11T17:39:26.510 回答