How to dump a file stored in a sqlite database as a blob?

前端 未结 4 686
慢半拍i
慢半拍i 2020-12-13 06:32

I have a sqlite3 database. One column has the TEXT type, and contains blobs which I would like to save as file. Those are gzipped files.

The output of the command

相关标签:
4条回答
  • 2020-12-13 06:57

    sqlite3 cannot output binary data directly, so you have to convert the data to a hexdump, use cut to extract the hex digits from the blob literal, and use xxd (part of the vim package) to convert the hexdump back into binary:

    sqlite3 my.db "SELECT quote(MyBlob) FROM MyTable WHERE id = 1;"  \
    | cut -d\' -f2                                                   \
    | xxd -r -p                                                      \
    > object0.gz
    

    With SQLite 3.8.6 or later, the command-line shell includes the fileio extension, which implements the writefile function:

    sqlite3 my.db "SELECT writefile('object0.gz', MyBlob) FROM MyTable WHERE id = 1"
    
    0 讨论(0)
  • 2020-12-13 07:03

    I had to make some minor changes on CL's answer, in order to make it work for me:

    • The structure for the command that he is using does not have the database name in it, the syntax that I am using is something like:

      sqlite3 mydatabase.sqlite3 "Select quote(BlobField) From TableWithBlod Where StringKey = '1';" | ...
      
    • The way he is using the cut command does not work in my machine. The correct way for me is:

      cut -d "'" -f2
      

    So the final command would be something like:

    sqlite3 mydatabase.sqlite3 "Select quote(BlobField) From TableWithBlod Where StringKey = '1';" | cut -d "'" -f2 | xxd -r -p > myfile.extension
    

    And in my case:

    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
    
    0 讨论(0)
  • 2020-12-13 07:15

    You can use writefile if using the sqlite3 command line tool:

    Example usage: select writefile('blob.bin', blob_column) from table where key='12345';

    0 讨论(0)
  • 2020-12-13 07:18

    In my case, I use "hex" instead of "quote" to retrieve image from database, and no need "cut" in the command pipe. For example:

    sqlite3 fr.db "select hex(bmp) from reg where id=1" | xxd -r -p > 2.png
    
    0 讨论(0)
提交回复
热议问题