【问题标题】:How to write a binary blob onto disk on Informix如何在 Informix 上将二进制 blob 写入磁盘
【发布时间】:2010-11-29 12:48:02
【问题描述】:

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

【问题讨论】:

    标签: sql informix


    【解决方案1】:

    数据是存储在 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
    

    你指定什么前缀并不重要 - 你只需要运行配置脚本。

    然后您可以编译所有内容 (make),或者您可以简单地编译程序 selblob (make selblob)。该程序就是我所说的“小插曲”;一个显示如何选择 BYTE blob 到磁盘的微观程序。然而,它也是全功能的;它几乎可以处理你扔给它的任何东西,或者诊断错误。

    如果你的数据库叫precious,字节数据在表byte_table,保存数据的列是byte_column,主键列是col1(需要的值是@987654331 @) 和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
    

    长度条件指定'&gt; 1'来处理卸载数据末尾的换行符。

    (对于“歇斯底里的葡萄干”,也就是“历史原因”,我仍然将 BYTE 和 TEXT 都称为“blob 类型”,尽管 IDS 9.00 为“智能 blob”引入了明确的名称 BLOB 和 CLOB,但两者略有不同具有大致对应功能的数据类型 - 在我的书中,它们都是 blob(小写)类型。这就是在 1990 年了解 BYTE 和 TEXT blob 的老家伙的问题,比添加 BLOB 和 CLOB blob 早了六年或更长时间. 无论如何,对于旧式 blob 没有一个好的替代官方术语;使用“哑巴”在政治上是不正确的!)

    【讨论】:

    • 你疯了乔恩......我也需要这个答案,如果它与informix有任何关系,它当然会成为你的答案
    • 显然 LOTOFILE 也适用于 BYTE 列,至少在 Informix 12.10 中是这样。感谢所有有用的 Informix 帖子,每次我在 Informix 上搜索某些内容时,您的名字都会弹出 :)
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-15
      • 1970-01-01
      • 2010-12-01
      • 1970-01-01
      • 2014-09-17
      • 2015-09-27
      • 2012-11-01
      相关资源
      最近更新 更多