题
我在Informix数据库的一些图像,作为二进制blob字段(JPG),我怎样才能写入图像投影到磁盘与SQL?
解决方案
被存储在字节或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软件获得SQLCMD归档和提取软件。你需要你的Informix环境设置,你需要能够编译C程序。然后运行:
./configure --prefix=$HOME/bin
这并没有多大无论如何指定为前缀 - 你只需要运行配置脚本
然后,您可以编译一切(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
此将所述字节值卸载到指定的文件。
如果您还没有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列,而不是一个字节的列,那么就不需要转换。您可以使用一个相当简单的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
”来处理在卸载数据的末尾的换行符。
(对于“歇斯底里的葡萄干”,又名“历史原因”,我还是叫两个字节和TEXT“blob类型”,即使IDS 9.00介绍了“智能斑点”明确名称BLOB和CLOB,略有不同的对数据类型,大约有相应的功能 - 在我的书,他们都BLOB(小写)类型与老家伙谁在1990年了解到BYTE和TEXT斑点,六年或以上的麻烦添加BLOB和CLOB斑点之前。 。 在任何情况下,没有对老式的斑点一个很好的选择,官方术语;使用“哑斑点”不是政治正确!)
其他提示
您需要写一个小程序,查询数据库并保存斑点到磁盘。大多数数据库都没有“磁盘打开文件”。
的概念