Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将存储在sqlite数据库中的文件作为blob转储?_Sqlite_Blob - Fatal编程技术网

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

如何将存储在sqlite数据库中的文件作为blob转储?,sqlite,blob,Sqlite,Blob,我有一个sqlite3数据库。其中一列是文本类型,包含我想另存为文件的blob。那些是gzip文件 命令sqlite3 db.sqlite3.dump“的输出为: 插入到“数据”值中(1、'objects'、'object0.gz',X'1F8B0800000000000000[…几千个十六进制字符..]F3F5EF') 如何使用命令行将sqlite文件中的二进制数据提取到文件中?sqlite3无法直接输出二进制数据,因此必须将数据转换为hexdump,使用cut从blob文本中提取十六进制数字

我有一个sqlite3数据库。其中一列是文本类型,包含我想另存为文件的blob。那些是gzip文件

命令
sqlite3 db.sqlite3.dump“
的输出为:

插入到“数据”值中(1、'objects'、'object0.gz',X'1F8B0800000000000000[…几千个十六进制字符..]F3F5EF')


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

sqlite3
无法直接输出二进制数据,因此必须将数据转换为hexdump,使用
cut
从blob文本中提取十六进制数字,并使用
xxd
(vim包的一部分)要将hextump转换回二进制,请执行以下操作:

sqlite3 my.db”从id=1的MyTable中选择quote(MyBlob)\
|切割-d\'-f2\
|xxd-r-p\
>object0.gz
对于SQLite 3.8.6或更高版本,命令行shell包括
fileio
扩展,它实现了:

sqlite3 my.db“从id=1的MyTable中选择writefile('object0.gz',MyBlob)”

为了让它对我有用,我不得不对的答案做一些小改动:

  • 他正在使用的命令的结构中没有数据库名称,我正在使用的语法类似于:

    sqlite3 mydatabase.sqlite3 "Select quote(BlobField) From TableWithBlod Where StringKey = '1';" | ...
    
    sqlite3 mydatabase.sqlite3 "Select quote(BlobField) From TableWithBlod Where StringKey = '1';" | cut -d "'" -f2 | xxd -r -p > myfile.extension
    
  • 他使用
    cut
    命令的方式在我的机器上不起作用。对我来说,正确的方法是:

    cut -d "'" -f2
    
所以最后的命令是这样的:

sqlite3 mydatabase.sqlite3 "Select quote(BlobField) From TableWithBlod Where StringKey = '1';" | ...
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
在我的例子中,我使用“hex”而不是“quote”从数据库检索图像,并且不需要在命令管道中使用“cut”。例如:

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

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

用法示例:
从key='12345'所在的表中选择writefile('blob.bin',blob_列)

什么样的命令行?我的意思是在终端中运行sqlite3。cut-d\'-f2完成相同的任务,并且比上面的sed语句更容易键入。顺便说一句,在我的例子中,
xxd
可以处理带引号或不带引号的hextdump这是一个完美的答案。