我在informix数据库中有一些图像,作为二进制blob字段(jpg),如何用SQL将图像写入磁盘?
答案 0 :(得分:7)
数据是存储在BYTE还是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编译器,那么我建议从IIUG Software Archive获取SQLCMD并解压缩软件。您需要Informix环境集,并且需要能够编译C程序。然后运行:
./configure --prefix=$HOME/bin
您指定的前缀并不重要 - 您只需运行configure脚本。
然后您可以编译所有内容(make
),也可以只编译程序selblob
(make selblob
)。那个节目就是我所谓的'小插曲';一个微观程序,显示如何选择BYTE 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编译器或使用它们的权限,那么生活就更难了。最接近的方法是在DB-Access中使用UNLOAD语句:
dbaccess precious - <<!
unload to "output_file"
select byte_column from byte_table where col1 = 23 and col2 = 'Habeas Corpus';
!
这将创建一个包含字节值的十六进制转储的文件(每个字符2个字节)。然后,您需要对文件进行后处理,以将十六进制转换为常规数据。请注意,如果列是TEXT列而不是BYTE列,则不需要转换。您可以使用一个相当简单的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
”来处理卸载数据末尾的换行符。
(对于'歇斯底里的葡萄干',又名'历史原因',我仍然称之为BYTE和TEXT'blob类型',尽管IDS 9.00为'smart blobs'引入了显式名称BLOB和CLOB,这是一对略有不同的具有大致相应功能的数据类型 - 在我的书中,它们都是blob(小写)类型。这是在1990年,在BLOB和CLOB blob添加之前六年或更长时间了解BYTE和TEXT blob的老家伙的麻烦。 在任何情况下,旧式blob都没有一个好的替代官方术语;使用'dumb blobs'在政治上是不正确的!)
答案 1 :(得分:0)
您需要编写一个查询数据库并将blob保存到磁盘的小程序。大多数数据库都没有“在磁盘上打开文件”的概念。