【问题标题】:How to dump a file stored in a sqlite database as a blob?如何将存储在 sqlite 数据库中的文件作为 blob 转储?
【发布时间】:2016-04-22 16:31:56
【问题描述】:

我有一个 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。

标签: sqlite blob


【解决方案1】:

sqlite3 无法直接输出二进制数据,因此您必须将数据转换为 hexdump,使用 cut 从 blob 文字中提取十六进制数字,并使用 xxdvim 包的一部分) 将 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 function

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

【讨论】:

  • cut -d\' -f2 完成同样的任务,并且比上面的 sed 语句更容易输入。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    示例用法: select writefile('blob.bin', blob_column) from table where key='12345';

    【讨论】:

    • 这是完美的答案。
    【解决方案4】:

    我不得不对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
    

    【讨论】:

    • 顺便说一句,在我的情况下,xxd 可以处理带引号或不带引号的 hexdump
    猜你喜欢
    • 2014-04-07
    • 2018-05-24
    • 2011-03-17
    • 1970-01-01
    • 2017-08-19
    • 2012-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多