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

Sql 如何在Informix上将二进制blob写入磁盘,sql,informix,Sql,Informix,我在informix数据库中有一些图像,作为二进制blob字段(jpg),如何使用SQL将图像写入磁盘?您需要编写一个小程序来查询数据库并将blob保存到磁盘。大多数数据库没有“在磁盘上打开文件”的概念。数据是存储在字节还是BLOB字段中 如果数据存储在BLOB列中,则可以使用: SELECT LOTOFILE(blob_column, '/path/to/file/on/client', 'client') FROM TheTable WHERE PK_Column = 23411

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

您需要编写一个小程序来查询数据库并将blob保存到磁盘。大多数数据库没有“在磁盘上打开文件”的概念。

数据是存储在字节还是BLOB字段中

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

SELECT LOTOFILE(blob_column, '/path/to/file/on/client', 'client')
  FROM TheTable
 WHERE PK_Column = 23411   -- PK value
如果数据存储在字节列中,那么您必须更加努力地工作。如果您的计算机上有ESQL/C(ClientSDK)和C编译器,那么我建议从获取SQLCMD并提取软件。您需要Informix环境集,并且需要能够编译C程序。然后运行:

./configure --prefix=$HOME/bin
指定什么作为前缀并不重要,只需运行configure脚本即可

然后,您可以编译所有内容(
make
),也可以只编译程序
selblob
makeselblob
)。那个节目就是我所说的“小插曲”;一个微型程序,显示如何选择一个字节块到磁盘。然而,它也是功能齐全的;它可以处理任何你扔给它的东西,或者诊断错误

如果您的数据库名为
precious
,则字节数据位于表
byte\u table
,保存数据的列为
byte\u column
,主键列为
col1
(所需值为
23
)和
col2
(所需值为
“人身保护令”
),然后您可以运行:

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';
!
dbaccess-
这将创建一个包含字节值十六进制转储(每个字符2个字节)的文件。然后需要对文件进行后期处理,将十六进制转换为常规数据。请注意,如果该列是文本列而不是字节列,则不需要进行转换。您可以使用一个相当简单的Perl脚本来进行转换(前提是文件足够小,可以将其放入内存中-如果文件不够小,您必须更加努力):

perl-w-e'
$/ = "";
我的$data=;
而(长度($data)>1)
{
my$hex=substr($data,0,2);
printf“%c”,十六进制($hex);
$data=substr($data,2);

}“你疯了,乔恩。。。我也需要这个答案,当然,如果它与Informix有任何关系,它将是您的答案。显然,LOTOFILE也可以在字节列上工作,至少在Informix 12.10中是这样。感谢所有有用的Informix帖子,每次我在Informix上搜索时,都会弹出您的名字:)
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