2012-04-27 4 views
6

Я хочу вставить двоичные данные (png, jpg, gif и т. Д.) В базу данных sqlite3 в сценарии bash.
Я использую автономный двоичный код sqlite3. Как написать инструкцию SQL?
Спасибо за помощь.Как вставить двоичные данные в базу данных sqlite3 в bash?

+0

Я не уверен, что инструмент командной строки позволит вам вставлять произвольные данные. Полагаю, вы могли бы base64 кодировать данные. – larsks

ответ

5

Вот один из способов сделать это. Файл test.jpg вставляется в таблицу foo базы данных foodb после того, как hexdump ред двоичному буквального формате SQLite:

[[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

И здесь мы видим, что данные хранят в " полной верности»в качестве файла .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 

Кроме того, этот подход является пространство эффективно, как хранить .jpg, используя sqlit e BLOB. Он не строит изображение, используя, например, кодировку base64.

[[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 в двоичных данных. Пожалуйста, прочитайте о BLOB-типе sqlite. То, что вы ожидаете, это данные, хранящиеся в некотором человеко-читаемом формате, что является менее экономичным по площади, поэтому OP не требует такого требования. –

9

Как я уже упомянул в ответ на ответ @ 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 
Смежные вопросы