2013-03-16 131 views
25

我有一个sqlite3数据库。一列有TEXT类型,并且包含我想要保存为文件的blob。这些是gzip文件。如何将存储在sqlite数据库中的文件转储为blob?

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

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

如何可以我从源码文件中的二进制数据中提取到使用命令行文件?

+0

什么样的命令行? – 2013-03-16 13:56:45

+0

我的意思是在终端中运行sqlite3。 – alecail 2013-03-16 14:04:30

回答

47

sqlite3不能输出的二进制数据直接,所以得将数据转换成一个hexdump都使用cut提取从团块字面的十六进制数字,并使用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或更高版本,命令行壳包括fileio延伸,它实现了writefile function

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

cut -d'-f2完成相同的任务,比上面的sed语句更容易输入。 – MagerValp 2013-11-20 12:49:05

+0

确实;谢谢! – 2013-11-20 14:52:56

2

我不得不做出对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 
+0

顺便说一句,在我的情况'xxd'可以处理与引号或不带引号的hexdump – 2016-10-17 18:57:16

0

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

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