2012-04-27 23 views
6

Quiero insertar datos binarios (png, jpg, gif, etc.) en una base de datos sqlite3 dentro de un script bash.
Uso el binario independiente sqlite3. ¿Cómo puedo escribir la declaración SQL?
Gracias por su ayuda.¿Cómo insertar datos binarios en la base de datos sqlite3 en bash?

+0

No estoy seguro de que la herramienta de línea de comandos le permitirá insertar datos arbitrarios por el estilo. En primer lugar, podrías base64 codificar los datos, supongo. – larsks

Respuesta

5

Aquí hay una manera de hacerlo. El archivo test.jpg se inserta en la tabla de foo de la base de datos foodb después de estar hexdump ed al formato literal binaria de 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 

EDITAR

Y aquí vemos que los datos son almacenados en " plena fidelidad" que el archivo .jpg puede ser restaurada:

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

Por otra parte, este enfoque es eficiente del espacio, ya que almacenar la .jpg usando sqlit e tipo BLOB. No codifica la imagen utilizando, por ejemplo, la codificación base64.

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

Gracias. Lo intentaré. – kev

+0

Esto no funcionará :(Sé que no funcionará, porque lo iba a publicar hace 20 minutos, pero no puedo hacer que funcionen algunos casos de prueba. Específicamente, si consulta esa columna, los resultados serán truncado en el primer 0x00 (en jpeg, está casi garantizado que tendrá un byte NULL en alguna parte). Si selecciona 'quote (bar)' le dará el x 'original' ... ' –

+0

@DavidSouther: is not es normal tener 0x00 en datos binarios ??? por favor lea sobre el tipo BLOB de sqlite. Lo que está esperando es que los datos estén almacenados en algún formato legible por humanos que sea mucho menos eficiente en cuanto a espacio, el OP no lo requiere. –

9

Como mencioné en el comentario en la respuesta de @ sixfeetsix, insertar los datos es solo la mitad del problema. Una vez que esté dentro, tendrás que volver a sacarlo. Podemos usar xxd para esto.

#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 
Cuestiones relacionadas