如何在Informix上将二进制blob写入磁盘

时间:2009-09-18 15:15:44

标签: sql informix

我在informix数据库中有一些图像,作为二进制blob字段(jpg),如何用SQL将图像写入磁盘?

2 个答案:

答案 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),也可以只编译程序selblobmake 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保存到磁盘的小程序。大多数数据库都没有“在磁盘上打开文件”的概念。