Как вставить двоичные данные в базу данных sqlite3 в bash?
Я хочу вставить двоичные данные (png,jpg,gif и т. д.) в базу данных sqlite3 в сценарии bash.
Я использую автономный двоичный файл sqlite3
. Как я могу написать инструкцию SQL?
Спасибо за помощь.
2 ответов
вот один из способов сделать это. Файл test.jpg
вставляется в таблицу foo
базы данных foodb
после hexdump
ed в двоичном литеральном формате sqlite:
[someone@somewhere tmp]$ sqlite3 foodb "create table foo (bar blob);"
[someone@somewhere tmp]$ echo "insert into foo values (X'`hexdump -ve '1/1 "%.2x"' test.jpg`');" | sqlite3 foodb
редактировать
и здесь мы видим, что данные хранятся в" полной точности " как .jpg файл можно восстановить:
[somneone@somewhere tmp]$ sqlite3 foodb "select quote(bar) from foo;" | perl -ne 's/([0-9a-f]{2})/print chr hex /gie' > bla.jpg
[somneone@somewhere 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
[someone@somewhere tmp]$ md5sum *.jpg
3237a2b76050f2780c592455b3414813 bla.jpg
3237a2b76050f2780c592455b3414813 test.jpg
кроме того, этот подход является эффективным, поскольку он хранит.jpg с использованием типа BLOB sqlite. Он не stringify изображение, используя для пример кодирования base64.
[someone@somewhere tmp]$ ll foodb
-rw-r--r-- 1 someone someone 622592 Apr 28 16:37 foodb
Как я уже упоминал в комментарии к ответу @sixfeetsix, вставка данных - это только половина проблемы. Как только он будет внутри, вам нужно будет вернуть его обратно. Мы можем использовать 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