代码之家  ›  专栏  ›  技术社区  ›  levhita

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

  •  7
  • levhita  · 技术社区  · 15 年前

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

    2 回复  |  直到 15 年前
        1
  •  7
  •   Jonathan Leffler    15 年前

    数据是存储在字节字段还是blob字段中?

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

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

    如果数据存储在字节列中,那么您必须更加努力地工作。如果您的计算机上有ESQL/C(clientsdk)和C编译器,那么我建议您从 IIUG Software Archive 以及提取软件。您需要Informix环境集,并且您需要能够编译C程序。然后运行:

    ./configure --prefix=$HOME/bin
    

    指定什么作为前缀并不重要,只需运行配置脚本即可。

    然后您可以编译所有内容( make 或者您可以简单地编译程序 selblob ( make selblob )这个程序就是我所说的“vignette”;一个展示如何选择一个字节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个字节)的文件。然后,您需要对文件进行后处理,以将十六进制转换为常规数据。请注意,如果列是文本列而不是字节列,则不需要转换。您可以使用一个相当简单的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 '处理卸载数据末尾的换行符。

    (对于“歇斯底里的葡萄干”,也就是“历史原因”,我仍然称字节和文本为“blob类型”,尽管IDS9.00为“智能blob”引入了显式名称blob和clob,这是一对稍有不同的数据类型,具有大致对应的功能——在我的书中,它们都是blob(小写)类型。这就是1990年学过字节和文本blob的老年人的问题,在添加blob和clob blob之前6年或更长时间。 在任何情况下,没有一个很好的官方术语来代替老式的斑点;使用“哑斑点”在政治上是不正确的!)

        2
  •  0
  •   Aaron Digulla    15 年前

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