2012-04-27 3 views
6

bashスクリプト内のsqlite3データベースにバイナリデータ(png、jpg、gifなど)を挿入します。
スタンドアロンバイナリsqlite3を使用します。どのようにしてSQL文を書くことができますか?
ご協力いただきありがとうございます。bashのsqlite3データベースにバイナリデータを挿入するには?

+0

コマンドラインツールでは、このような任意のデータを挿入することはできません。最初にデータをbase64でエンコードすることができました。 – larsks

答えて

5

これを行う方法の1つです。

そして、ここでは、我々はデータをストアがであることがわかり

[[email protected] tmp]$ sqlite3 foodb "create table foo (bar blob);" 
[[email protected] tmp]$ echo "insert into foo values (X'`hexdump -ve '1/1 "%.2x"' test.jpg`');" | sqlite3 foodb 

EDIT」:ファイルtest.jpgはsqliteののバイナリリテラル形式にhexdump編をされた後、テーブルのデータベースfoodbfooに挿入されています.jpgファイルを復元することができます。

[[email protected] tmp]$ sqlite3 foodb "select quote(bar) from foo;" | perl -ne 's/([0-9a-f]{2})/print chr hex $1/gie' > bla.jpg 
[[email protected] tmp]$ ll *.jpg 
-rw-rw-r-- 1 someone someone 618441 Apr 28 16:59 bla.jpg 
-rw-rw-r-- 1 someone someone 618441 Apr 28 16:37 test.jpg 
[[email protected] tmp]$ md5sum *.jpg 
3237a2b76050f2780c592455b3414813 bla.jpg 
3237a2b76050f2780c592455b3414813 test.jpg 

さらに、この方法は、sqlitを使用して.jpgを保存するため、スペース効率が高くなりますeのBLOBタイプです。たとえば、base64エンコーディングを使用してイメージをストリング化しません。私は@ sixfeetsixの答えにコメントで述べたように

[[email protected] tmp]$ ll foodb 
-rw-r--r-- 1 someone someone 622592 Apr 28 16:37 foodb 
+0

ありがとうございます。私はそれを試してみます。 – kev

+0

これはうまくいきません:(20分前に投稿するつもりだったので動作しないことは分かっていますが、いくつかのテストケースが動作しないことがあります。最初の0x00で切り捨てられます(jpegではほとんどどこかにNULLバイトがあることが保証されています)。 'quote(bar) 'を選択すると元のx' ... 'が返されます。 –

+0

@DavidSouther:そうではありませんバイナリデータで0x00を持つのは普通ですか?sqliteのBLOB型について読んでください。人間が読める形式で保存されているデータは、空間効率の良い方法で保存されていますが、OPではこのような必要はありません。 –

9

は、データを挿入するだけで問題の半分です。それが入ったら、それを取り戻す必要があります。これにxxdを使うことができます。

#A nice hubble image to work with. 
echo 'http://asd.gsfc.nasa.gov/archive/hubble/Hubble_20th.jpg' > imageurl.txt 
image=imageurl.txt 
curl $image > image.jpg 

#Insert the image, using hexdump to read the data into SQLite's BLOB literal syntax. 
echo "create table images (image blob);" | sqlite3 images.db 
echo "insert into images (image) values(x'$(hexdump -ve '1/1 "%0.2X"' image.jpg)');" | sqlite3 images.db 2>&1 

#Select just the one image, then use xxd to convert from hex back to binary. 
echo "select quote(image) from images limit 1 offset 0;" | sqlite3 images.db | tr -d "X'" | xxd -r -p > newimage.jpg 
eog newimage.jpg 
関連する問題