Как записать двоичный blob на диск в Informix
У меня есть некоторые изображения в базе данных informix, как двоичное поле blob (jpg), как я могу записать изображения на диск с помощью SQL?
2 ответов
хранятся ли данные в байте или поле BLOB?
если данные хранятся в столбце BLOB, то вы можете использовать:
SELECT LOTOFILE(blob_column, '/path/to/file/on/client', 'client')
FROM TheTable
WHERE PK_Column = 23411 -- PK value
если данные хранятся в столбце BYTE, то вам придется работать гораздо сложнее. Если у вас есть ESQL / C (ClientSDK) и компилятор C на вашем компьютере, то я рекомендую получить SQLCMD из в архиве программного обеспечения и извлечение программного обеспечения. Вам нужен набор среды Informix, и вы должны иметь возможность компилировать C программы. Тогда беги:
./configure --prefix=$HOME/bin
не имеет значения что вы укажете в качестве префикса - вам просто нужно запустить скрипт configure.
вы можете либо скомпилировать все (make
), или вы можете просто скомпилировать программу selblob
(make selblob
). Эта программа-то, что я называю "виньеткой"; микроскопическая программа, которая показывает, как выбрать байтовый blob на диск. Это, однако, также полностью функциональна; она будет работать с просто ни о чем, что вы бросаете на нее, или диагностировать ошибку.
если ваша база данных называется precious
байта данных в таблице byte_table
столбец проведения данных byte_column
, а столбцы первичного ключа -col1
(и требуемое значение 23
) и col2
(и требуемое значение "Habeas Corpus"
), то вы можете запустить:
selblob -d precious -t byte_table -k col1=23 -k col2="Habeas Corpus" \
-c byte_column -f output_file
это выгрузит значение байта в именованный файл.
если у вас нет ESQL / C или компилятора C или разрешения использовать их, то жизнь больше трудный. Ближайший подход-использовать оператор UNLOAD в DB-Access:
dbaccess precious - <<!
unload to "output_file"
select byte_column from byte_table where col1 = 23 and col2 = 'Habeas Corpus';
!
это создаст файл, содержащий шестнадцатеричный дамп значения байта (2 байта на символ). Затем вам нужно обработать файл, чтобы преобразовать hex в обычные данные. Обратите внимание, что если столбец является текстовым столбцом, а не столбцом байтов, преобразование не потребуется. Вы можете использовать довольно простой скрипт Perl для преобразования (при условии, что файл достаточно мал, чтобы его можно было проглотить память-вы должны работать усерднее, если она недостаточно мала):
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
условие длины указывает'> 1
' для работы с новой строкой в конце выгруженных данных.
(для "истерического изюма", он же "исторические причины", я по-прежнему называю и байт и текст "типами blob", хотя IDS 9.00 ввел явные имена BLOB и CLOB для "умных blobs", немного другая пара типов данных с примерно соответствующей функциональностью - в моей книге они все типы blob (нижний регистр). Вот в чем беда со стариками, которые узнали о байтовых и текстовых кляксах в 1990 году, за шесть лет или больше до того, как они были добавлены. В любом случае, нет хорошей альтернативной официальной терминологии для старых капель стиля; использование "тупых капель" не политкорректно!)
нужно написать небольшую программу, которая запрашивает базу данных и сохраняет кляксы на диск. Большинство баз данных не имеют понятия "открыть файл на диске".