SQLite丢弃零

时间:2014-05-06 17:16:34

标签: sqlite

我正在使用google wrapper(sqlite3pp)插入包含一些零的char数组。 SQLite的问题是丢弃零和它之后的下一个元素。

char array[11] = {1,2,3,4,5,0,3,4,0,6,7};

sqlite3pp::command cmd(db, "INSERT INTO messages (id, payload) VALUES (?, ?)");

cmd.bind(1,index);
cmd.bind(2,&array[0],sizeof(array));

此代码仅插入:1 2 3 4 5

有效负载类型为varchar。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

sqlite3pp为bind()函数定义了这两个重载:

int bind(int idx, char const* value, bool fstatic = true);
int bind(int idx, void const* value, int n, bool fstatic = true);

您希望使用具有显式长度的第二个,但第一个被选中,而sizeof(array)被评估为11,被截断为bool值{{1}并以true而不是大小传递。然后包装器认为该值是一个普通的NUL终止字符串,因此只存储该部分直到第一个零。


您可以帮助编译器选择正确的版本,例如通过提供如下隐含参数:

fstatic

(或cmd.bind(2, &array[0], sizeof(array), true); 在查询完成执行之前将释放数组。)


此外,读取行也可能存在问题 - 例如std :: string的默认sqlite3pp getter不能使用二进制零,并且需要像这样显式检索内容:

false