使用 SQLiteStudio 更新查询以将零附加到 blob 字段

Update query to append zeroes into blob field with SQLiteStudio

我正在尝试将零附加到 sqlite3 数据库中的 blob 字段。 我试过的是这样的:

UPDATE Logs
SET msg_buffer =  msg_buffer || zeroblob(1)
WHERE msg_id = 'F0'

如您所见,字段名称是"msg_buffer",我想要的是附加字节零。似乎连接运算符 ||不起作用。 我怎么能做到这一点?

SQLite3 支持数据类型。参见 https://www.sqlite.org/datatype3.html

它们并不严格与列的声明类型相关联,而是与每个单元格值单独相关联。类型由 created/modified 决定。例如,如果您插入 5,它将是 INTEGER。如果你插入 5.5,它将是真实的。如果你插入'test',它将是TEXT,如果你插入zeroblob(1),它将是BLOB,如果你插入null,它将是NULL。

现在,您正在做的是尝试将当前值与 BLOB 类型连接起来。如果当前值为 TEXT(或者基本上如果您使用 || 运算符,就像您所做的那样,您正在将任何类型转换为 TEXT),它将与字节 \x00 连接,这实际上确定了字符串的结尾。换句话说,您正在向 TEXT 类型已经存在的字符串终止符添加另一个字符串终止符。

此操作的输出不会有任何变化。 TEXT 总是以字节 0 结尾,并且总是从结果中排除,因为它是元字符,而不是值本身。

来自 http://sqlite.1065341.n5.nabble.com/Append-data-to-a-BLOB-field-td46003.html 的附加信息 - 无法将二进制数据附加到 BLOB 字段。您可以修改预分配的 blob:

Append is not possible. But if you preallocate space using zeroblob() or similar, you can write to it using the incremental blob API:

http://www.sqlite.org/c3ref/blob_open.html

最后,请参阅已接受的答案,因为问题的作者找到了一个有趣的解决方案。

阅读 Googie 发布的文档 link(3.2. Affinity Of Expressions),我设法找到了方法:

UPDATE Logs
SET msg_buffer =  CAST(msg_buffer || zeroblob(1) AS blob)
WHERE msg_id = 'F0'

CAST 运算符可以采用连接运算符的表达式并强制 blob 亲和力。