我正在使用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。
有什么想法吗?
答案 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