我有一个sqlite3的数据库。 一列具有文本类型,并包含斑点,我想保存为文件。 这些都是gzip压缩文件。
该命令的输出sqlite3 db.sqlite3 ".dump"
是:
INSERT INTO "data" VALUES(1,'objects','object0.gz',X'1F8B080000000000000 [.. a few thousands of hexadecimal characters ..] F3F5EF')
我如何可以提取从源码文件中的二进制数据使用命令行文件?
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
功能 :
sqlite3 my.db "SELECT writefile('object0.gz', MyBlob) FROM MyTable WHERE id = 1"
我不得不做出一些细微的变化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
就我而言,我使用“十六进制”,而不是“引用”从数据库中检索图像,并没有必要“切断”的命令管道。 例如:
sqlite3 fr.db "select hex(bmp) from reg where id=1" | xxd -r -p > 2.png