如何在SQLite中逐段更新Blob?

9
我在SQLite应用中有大型BLOB数据,需要逐段更新其中的小部分。比如说,“用数据D更新BLOB B中X到Y字节的内容”。其他数据库可以使用Blob操作函数来实现,但我无法在SQLite中找到类似功能。是否被卡住了?还是SQLite有处理BLOB的方法?
谢谢。
3个回答

8
这并不是直接回答你的问题,但我有使用SQLite中的随机访问(big)blobs的经验,并建议您如果可以的话不要使用它。原因如下:
Blobs完全破坏了SQL查询格式。如果您的blob数据需要任何类型的处理,那么它肯定在某个时候需要过滤。在SQL中处理过滤的任何机制在这方面都将无用。
与原始文件中的二进制数据相比,处理包含在数据库中的二进制blobs会限制您的选项。您将无法从多个进程同时随机读取和写入数据,这在文件中是可能的。您无法使用仅提供文件I/O接口的任何处理此数据的工具。您无法截断或调整blob的大小。文件更加灵活。
将所有内容包含在一个文件中似乎很方便,因为它简化了备份和传输,但是使用blobs的痛苦根本不值得。
所以作为您的助手,我建议您将您的blobs作为原始文件写入文件系统,并仅在数据库中存储文件名的引用。如果您的blobs相当小且保证不会增长,请忽略我的建议。

2
我的Blob可能偶爾會增長,但那是在全面升級服務期間,因此可以“安全”地說它們在“產品週期”內保持恆定的長度(無論週期長短如何)。 - Robert Gould
1
但是,我完全同意你所说的每一个字,我真的很想避免使用blobs,但是由于规格书的布局方式,我别无选择 :/ - Robert Gould
点赞。在这件事结束之前,他将需要大量的法律建议。 :P - Cray

6

SQLite 3.x支持通过sqlite3_blob_write函数实现此功能。

int sqlite3_blob_write(sqlite3_blob *, const void *z, int n, int iOffset)

请注意,此功能是作为SQLite 3 C/C++ API的一部分提供的。您需要直接针对此进行编程才能使用它。
如果您正在使用其他高级封装器(例如System.Data.SQLite),据我上次查看,您将无法访问此功能。

对于任何读者,仅供参考,看起来这种功能存在于System.Data.SQLite版本1.0.103.0及以上(发布于2016年9月15日左右)。 - fostandy

3
我非常赞同paniq所说的一切。使用BLOB会大大限制您的选项。
如果您正在使用System.Data.SQLite,则无法真正支持BLOBs。这就是为什么我编写了自己的类来处理它们。您可以在此处找到代码:示例BLOB代码 请注意,SQLite对于那些敢于使用BLOB的人有几个潜在的缺陷。其中一个主要问题是,在允许您检查其长度之前,SQLite会将整个BLOB字段加载到内存中。因此,如果您有较大的BLOB字段,需要预期大量的内存抖动...

1
你的文件已丢失。 - Cruiser KID

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接