40

我有一个 sqlite3 数据库。一列具有 TEXT 类型,并包含我想保存为文件的 blob。这些是压缩文件。

该命令的输出sqlite3 db.sqlite3 ".dump" 是:

INSERT INTO "data" VALUES(1,'objects','object0.gz',X'1F8B080000000000000 [.. a few thousands of hexadecimal characters ..] F3F5EF')

如何使用命令行将 sqlite 文件中的二进制数据提取到文件中?

4

4 回答 4

70

sqlite3无法直接输出二进制数据,因此您必须将数据转换为 hexdump,用于cut从 blob 文字中提取十六进制数字,并使用xxdvim包的一部分)将 hexdump 转换回二进制:

sqlite3 my.db "SELECT quote(MyBlob) FROM MyTable WHERE id = 1;"  \
| cut -d\' -f2                                                   \
| xxd -r -p                                                      \
> object0.gz

对于 SQLite 3.8.6 或更高版本,命令行 shell 包含fileio扩展,它实现了以下writefile功能

sqlite3 my.db "SELECT writefile('object0.gz', MyBlob) FROM MyTable WHERE id = 1"
于 2013-03-16T15:41:32.800 回答
6

writefile如果使用sqlite3命令行工具,您可以使用:

示例用法: select writefile('blob.bin', blob_column) from table where key='12345';

于 2020-06-05T19:25:06.227 回答
6

就我而言,我使用“hex”而不是“quote”从数据库中检索图像,并且不需要在命令管道中“剪切”。例如:

sqlite3 fr.db "select hex(bmp) from reg where id=1" | xxd -r -p > 2.png
于 2018-03-09T03:24:54.203 回答
3

我不得不对CL的答案进行一些小的改动,以使其对我有用:

  • 他正在使用的命令的结构中没有数据库名称,我使用的语法类似于:

    sqlite3 mydatabase.sqlite3 "Select quote(BlobField) From TableWithBlod Where StringKey = '1';" | ...
    
  • 他使用cut命令的方式在我的机器上不起作用。对我来说正确的方法是:

    cut -d "'" -f2
    

所以最终的命令是这样的:

sqlite3 mydatabase.sqlite3 "Select quote(BlobField) From TableWithBlod Where StringKey = '1';" | cut -d "'" -f2 | xxd -r -p > myfile.extension

就我而言:

sqlite3 osm-carto_z14_m8_m.mbtiles "select quote(images.tile_data) from images where images.tile_id = '1';" | cut -d "'" -f2 | xxd -r -p > image.png
于 2014-06-04T19:23:34.673 回答