Ho alcune immagini in un database informix, come un campo blob blob (jpg), come posso scrivere le immagini sul disco con un SQL?Come scrivere un blob binario su disco su Informix
risposta
I dati sono memorizzati in un campo BYTE o BLOB?
Se i dati sono memorizzati in una colonna BLOB, quindi è possibile utilizzare:
SELECT LOTOFILE(blob_column, '/path/to/file/on/client', 'client')
FROM TheTable
WHERE PK_Column = 23411 -- PK value
Se i dati sono memorizzati in una colonna BYTE, allora si deve lavorare piuttosto duro. Se si dispone di ESQL/C (ClientSDK) e un compilatore C sulla macchina, quindi si consiglia di ottenere SQLCMD dal IIUG Software Archive ed estrarre il software. È necessario il proprio set di ambienti Informix e si deve essere in grado di compilare programmi C. Quindi esegui:
Non ha molta importanza quello che viene specificato come prefisso: è sufficiente eseguire lo script di configurazione.
È quindi possibile compilare tutto (make
) oppure è possibile semplicemente compilare il programma selblob
(make selblob
). Quel programma è ciò che chiamo una "vignetta"; un programma microscopico che mostra come selezionare un BLOB BYTE su disco. È, tuttavia, anche pienamente funzionale; funzionerà con qualsiasi cosa tu passi o diagnostichi un errore.
Se il database si chiama precious
, il byte di dati è in una tabella byte_table
, colonna che contiene i dati è byte_column
, e le colonne chiave primaria sono col1
(e il valore richiesto è 23
) e col2
(e il valore richiesto è "Habeas Corpus"
), allora è possibile eseguire:
selblob -d precious -t byte_table -k col1=23 -k col2="Habeas Corpus" \
-c byte_column -f output_file
Questo scaricherà il valore di byte in un file nominato.
Se non si dispone del compilatore ESQL/C o C o del permesso per utilizzarli, la vita è più difficile. L'approccio più vicino è quello di utilizzare l'istruzione SCARICO nel DB-Access:
dbaccess precious - <<!
unload to "output_file"
select byte_column from byte_table where col1 = 23 and col2 = 'Habeas Corpus';
!
Questo creerà un file contenente un hex-dump del valore di byte (2 byte per carattere). È quindi necessario post-elaborare il file per convertire l'esadecimale in dati regolari. Si noti che se la colonna fosse una colonna TEXT anziché una colonna BYTE, non sarebbe necessaria alcuna conversione. È possibile utilizzare uno abbastanza semplice script in Perl per fare la conversione (a condizione che il file è abbastanza piccolo da essere slurped nella memoria - si deve lavorare di più, se non è abbastanza piccolo):
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 condizione lunghezza specifica ' > 1
'per gestire la nuova riga alla fine dei dati non caricati.
(Per "hysterical raisins", alias "ragioni storiche", chiamo ancora sia "tipi di blob" BYTE e TEXT, anche se IDS 9.00 ha introdotto i nomi espliciti BLOB e CLOB per "smart blob", una coppia leggermente diversa di tipi di dati con funzionalità approssimativamente corrispondenti - nel mio libro, sono tutti tipi blob (minuscole). Questo è il problema con i vecchi che hanno imparato a conoscere i BLOB di BYTE e TEXT nel 1990, sei anni o più prima che BLOB e BLOB di BLOB fossero aggiunto. In ogni caso, non esiste una buona terminologia ufficiale alternativa per i vecchi BLOB di stile; non è politicamente corretto!)
È necessario scrivere un piccolo programma che interroga il database e salva i BLOB sul disco. La maggior parte dei database non ha la nozione di "file aperto su disco".
Credo di essere abituato a MySQL – levhita
sei pazzo jon ... Avevo bisogno anche di questa risposta e ovviamente sarà la tua risposta se ha ottenuto qualcosa fare con informix – CheeseConQueso
Apparentemente LOTOFILE funziona anche su colonne BYTE, almeno in Informix 12.10. Grazie per tutti gli utili post Informix, ogni volta che cerco qualcosa su Informix il tuo nome compare :) – Otherside