如何将存储在sqlite数据库中的文件转储为blob?

时间:2013-03-16 10:52:56

标签: sqlite blob

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

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

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

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

4 个答案:

答案 0 :(得分:57)

sqlite3无法直接输出二进制数据,因此您必须将数据转换为hexdump,使用cut从blob文字中提取十六进制数字,并使用xxd(部分vim包)将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 function

sqlite3 my.db "SELECT writefile('object0.gz', MyBlob) FROM MyTable WHERE id = 1"

答案 1 :(得分: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

答案 2 :(得分:1)

在我的情况下,我使用" hex"而不是"引用"从数据库中检索图像,不需要" cut"在命令管道中。例如:

sqlite3 fr.db "select hex(bmp) from reg where id=1" | xxd -r -p > 2.png

答案 3 :(得分:1)

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

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