Tengo algunas imágenes en una base de datos informix, como un campo blob binario (jpg), ¿cómo puedo escribir las imágenes en el disco con un SQL?Cómo escribir un blob binario en el disco en Informix
Respuesta
¿Los datos están almacenados en un campo BYTE o BLOB?
Si los datos se almacenan en una columna BLOB, a continuación, puede utilizar:
SELECT LOTOFILE(blob_column, '/path/to/file/on/client', 'client')
FROM TheTable
WHERE PK_Column = 23411 -- PK value
Si los datos se almacenan en una columna BYTE, entonces usted tiene que trabajar más duro. Si tiene ESQL/C (ClientSDK) y un compilador de C en su máquina, entonces le recomiendo que obtenga SQLCMD del IIUG Software Archive y extraiga el software. Necesita su conjunto de entorno Informix, y necesita poder compilar programas C. Luego ejecute:
./configure --prefix=$HOME/bin
No importa mucho lo que especifique como el prefijo, solo necesita ejecutar el script de configuración.
Puede compilar todo (make
) o simplemente compilar el programa selblob
(make selblob
). Ese programa es lo que llamo una 'viñeta'; un programa microscópico que muestra cómo seleccionar un blob de BYTE en el disco. Sin embargo, también es completamente funcional; funcionará con casi cualquier cosa que le arroje, o diagnosticará un error.
Si su base de datos se llama precious
, el byte de datos está en una tabla byte_table
, la columna que tiene los datos son byte_column
, y las columnas de clave principal son col1
(y el valor requerido es 23
) y col2
(y el valor necesario "Habeas Corpus"
es), entonces se puede ejecutar:
selblob -d precious -t byte_table -k col1=23 -k col2="Habeas Corpus" \
-c byte_column -f output_file
Esto descargará el valor de byte en el archivo identificado.
Si no tiene un compilador de ESQL/C o C o permiso para usarlos, entonces la vida es más difícil. La máxima aproximación es utilizar la instrucción de descarga de DB-Access:
dbaccess precious - <<!
unload to "output_file"
select byte_column from byte_table where col1 = 23 and col2 = 'Habeas Corpus';
!
Esto creará un archivo que contiene un volcado hexadecimal del valor del byte (2 bytes por carácter). Luego necesita procesar el archivo para convertir el hexadecimal en datos regulares. Tenga en cuenta que si la columna era una columna TEXTO en lugar de una columna BYTE, entonces no se necesitaría ninguna conversión. Puede utilizar una bastante simple script en Perl para hacer la conversión (siempre que el archivo es lo suficientemente pequeño para ser sorbido en la memoria - que tiene que trabajar más duro si no es lo suficientemente pequeño):
perl -w -e '
$/ = "";
my $data = <>;
while (length($data) > 1)
{
my $hex = substr($data, 0, 2);
printf "%c", hex($hex);
$data = substr($data, 2);
}' <output_file
La condición de longitud especifica ' > 1
'para tratar con la nueva línea al final de los datos descargados.
(Para las "pasas histéricas", también conocidas como "razones históricas", sigo llamando a los "tipos de blobs" BYTE y TEXT, aunque IDS 9.00 introdujo los nombres explícitos BLOB y CLOB para "smart blobs", un par ligeramente diferente de tipos de datos con una funcionalidad aproximadamente equivalente: en mi libro, todos son tipos blob (minúsculas). Ese es el problema con los viejos que aprendieron blobs de BYTE y TEXT en 1990, seis años o más antes de que los blobs BLOB y CLOB fueran adicional. En cualquier caso, no hay una buena terminología oficial alternativa para los blobs de estilo antiguo; ¡Usar 'blobs tontos' no es políticamente correcto!)
Necesita escribir un pequeño programa que consulte la base de datos y guarde los blobs en el disco. La mayoría de las bases de datos no tienen noción de "abrir archivo en el disco".
Supongo que estoy acostumbrado a MySQL – levhita
- 1. Escribir un archivo descargado binario en un disco en Java
- 2. Guardar archivo binario en blob de httppostedfile
- 3. Escribir un búfer binario en un archivo en Python
- 4. Escribir archivo binario en Ruby
- 5. Usando Pisa para escribir un pdf en el disco
- 6. Escribir en el medio de un archivo binario existente C++
- 7. Django Campo binario o modelo BLOB
- 8. Cómo declarar un blob en SQL Server
- 9. Pasar blob binario a través de un proveedor de contenido
- 10. Cómo insertar/recuperar un archivo almacenado como un BLOB en MySQL db usando python
- 11. Condiciones (como "me gusta") en el campo binario (blob) en el oráculo
- 12. ¿Cómo puedo crear, escribir y luego devolver un archivo en C# sin guardarlo en el disco?
- 13. Guardar/Escribir NSMutableArray de los objetos en el disco?
- 14. ¿Se puede escribir HTML5 sessionStorage en el disco?
- 15. No se puede escribir un archivo binario
- 16. Codificación :: UndefinedConversionError al escribir un archivo binario
- 17. ¿Cómo puedo encontrar la longitud (tamaño) de un blob binario en sqlite?
- 18. ¿Cómo obtener el espacio en disco en un servidor?
- 19. Java: Escribir/Leer un mapa desde el disco
- 20. ¿Cómo escribir un directorio RAM de Lucene.Net de nuevo en el disco?
- 21. Cómo convertir existir Blob Blob a PageBlob
- 22. Guardar una cadena de Base64 en el disco como un binario usando PHP
- 23. Crear un archivo zip utilizando PHP clase ZipArchive sin escribir el archivo en el disco?
- 24. ¿Cómo leer y escribir UTF-8 en un disco en Android?
- 25. Guardar un DynamicMethod en el disco
- 26. Cómo escribir/actualizar Oracle blob de manera confiable?
- 27. lectura en un archivo binario en Haskell
- 28. ¿Cuál es la mejor manera de escribir un archivo grande en un disco en PHP?
- 29. ¿Cómo escribir un correo electrónico en el disco en lugar de enviarlo a una dirección real en asp.net?
- 30. Bash: escribir número entero de archivo binario
Estás loco jon ... Necesitaba esta respuesta también y por supuesto que va a ser tu respuesta si tiene algo hacer con informix – CheeseConQueso
Aparentemente LOTOFILE también funciona en columnas BYTE, al menos en Informix 12.10. Gracias por todas las útiles publicaciones de Informix, cada vez que busco algo en Informix, aparece tu nombre :) – Otherside