我正在尝试将零添加到sqlite3数据库中的blob字段。 我试过的是这个
UPDATE Logs
SET msg_buffer = msg_buffer || zeroblob(1)
WHERE msg_id = 'F0'
如您所见,字段名称是“ msg_buffer”,我想要的是附加字节零。似乎concat运算符||不起作用。 我怎样才能做到这一点?
答案 0 :(得分:1)
SQLite3 确实支持数据类型。参见https://www.sqlite.org/datatype3.html
它们并不严格与列的声明类型链接,而是每个单元格值各自独立。类型由创建/修改方式决定。例如,如果您插入5,它将是INTEGER。如果插入5.5,它将为REAL。如果您插入'test',它将是TEXT,如果您插入zeroblob(1),它将是BLOB,如果您插入null,则它将是NULL。
现在,您正在执行的操作是尝试将当前值与BLOB类型连接在一起。如果当前值为TEXT(或者基本上是使用||运算符,就像您将任何类型转换为TEXT一样),它将与字节\ x00串联,后者实际上确定了字符串的结尾。换句话说,您正在将另一个字符串终止符添加到TEXT类型已经具有的字符串终止符中。
此操作的输出将保持不变。 TEXT总是以零字节结尾,并且总是从结果中排除,因为它是一个元字符,而不是值本身。
http://sqlite.1065341.n5.nabble.com/Append-data-to-a-BLOB-field-td46003.html中的其他信息-无法将二进制数据附加到BLOB字段。您可以修改预分配的Blob:
无法添加。但是如果您使用以下方式预分配空间 zeroblob()或类似的,您可以使用增量写入 blob API:
最后,请参阅已接受的答案,因为问题的作者找到了一个有趣的解决方案。
答案 1 :(得分:1)
通过阅读Googie(3.2。表达式的相似性)发布的文档link,我设法找到了方法:
UPDATE Logs
SET msg_buffer = CAST(msg_buffer || zeroblob(1) AS blob)
WHERE msg_id = 'F0'
CAST运算符可以与连接运算符一起使用表达式,并强制Blob亲和力。