题 如何将存储在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文件解压缩到文件中?


27
2018-03-16 10:52


起源


什么样的命令行? - CL.
我的意思是在终端中运行sqlite3。 - alecail


答案:


sqlite3 不能直接输出二进制数据,所以你必须将数据转换为hexdump,使用 cut 从blob文字中提取十六进制数字,并使用 xxd (的一部分 vim package)将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"

51
2018-03-16 15:41



cut -d \'-f2完成相同的任务,并且比上面的sed语句更容易键入。 - MagerValp
确实;谢谢! - CL.


我不得不做一些小改动 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

3
2018-06-04 19:23



顺便说一下,就我而言 xxd 可以用引号或不带引号来处理hexdump - Csaba Toth


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

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

1
2018-03-09 03:24