我有一个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文件提取到文件中?
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
函数:
sqlite3 my.db "SELECT writefile('object0.gz', MyBlob) FROM MyTable WHERE id = 1"
如果使用sqlite3
命令行工具,可以使用writefile
:
使用例子:select writefile('blob.bin', blob_column) from table where key='12345';
在我的例子中,我使用"hex"而不是"quote"来从数据库中检索图像,并且不需要在命令管道中使用"cut"。例如:
sqlite3 fr.db "select hex(bmp) from reg where id=1" | xxd -r -p > 2.png
为了让它适合我,我不得不对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