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

lev*_*ita 7 sql informix

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

Jon*_*ler 7

数据是存储在BYTE还是BLOB字段中?

如果数据存储在BLOB列中,则可以使用:

SELECT LOTOFILE(blob_column, '/path/to/file/on/client', 'client')
  FROM TheTable
 WHERE PK_Column = 23411   -- PK value
Run Code Online (Sandbox Code Playgroud)

如果数据存储在BYTE列中,那么您必须更加努力地工作.如果您的计算机上有ESQL/C(ClientSDK)和C编译器,那么我建议从IIUG软件存档中获取SQLCMD 并解压缩软件.您需要Informix环境集,并且需要能够编译C程序.然后运行:

./configure --prefix=$HOME/bin
Run Code Online (Sandbox Code Playgroud)

您指定的前缀并不重要 - 您只需运行configure脚本即可.

然后你可以编译everything(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
Run Code Online (Sandbox Code Playgroud)

这会将字节值卸载到指定的文件中.

如果您没有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';
!
Run Code Online (Sandbox Code Playgroud)

这将创建一个包含字节值的十六进制转储的文件(每个字符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
Run Code Online (Sandbox Code Playgroud)

长度条件指定' > 1'处理卸载数据末尾的换行符.

(对于'歇斯底里的葡萄干',又名'历史原因',我仍然称之为BYTE和TEXT'blob类型',尽管IDS 9.00为'smart blobs'引入了显式名称BLOB和CLOB,这是一对略有不同的数据类型大致相应的功能 - 在我的书中,它们都是blob(小写)类型.这是在1990年,在BLOB和CLOB blob被添加之前六年或更长时间了解BYTE和TEXT blob的老家伙的麻烦.对于旧式blob,没有一个很好的替代官方术语;使用'dumb blobs'在政治上是不正确的!)