使用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/