数据库:Postgres 9.1
我有一个名为logos
的表,定义如下:
create type image_type as enum ('png');
create table logos (
id UUID primary key,
bytes bytea not null,
type image_type not null,
created timestamp with time zone default current_timestamp not null
);
create index logo_id_idx on logos(id);
我希望能够以两种方式将记录插入此表。
将在表格中插入第一个(也是最常见的)行,即用户将通过html文件上传表单提供PNG图像文件。处理服务器上的请求的代码将接收包含PNG图像文件中的数据的字节数组,并使用与解释here非常相似的内容在表中插入记录。有很多关于如何将字节数组插入到互联网上的bytea类型的postgresql字段中的示例。这是一个简单的练习。插入代码的示例如下所示:
insert into logos (id, bytes, type, created) values (?, ?, ?, now())
字节将设置为:
...
byte[] bytes = ... // read PNG file into a byte array.
...
ps.setBytes(2, bytes);
...
第二种方式行将插入表中,将来自纯文本文件脚本。这需要的原因只是将测试数据填充到表中以进行自动化测试,或者使用一些记录为远程开发环境初始化数据库。
无论数据如何输入表格,应用程序显然都需要能够从表格中选择bytea数据并将其转换回PNG图像。
问题
如何正确编码字节数组,以便能够从脚本中插入数据,以便只将文件中包含的原始字节存储在数据库中?
我可以编写代码来读取文件并吐出插入语句来填充脚本。但是我不知道如何对纯文本脚本的字节数组进行编码,这样当从psql运行脚本时,图像数据将与使用setBytes
jdbc代码插入文件时相同。
我想用这样的东西运行脚本:
psql -U username -d dataBase -a -f test_data.sql
答案 0 :(得分:3)
在IM文件中表示bytea
数据的最简单方法是使用hex format:
<强> 8.4.1。 bytea十六进制格式
“十六进制”格式将二进制数据编码为每个字节2个十六进制数字,最重要的是半字节数字。整个字符串前面是序列
\x
(以区别于转义格式)。在某些情况下,初始反斜杠可能需要通过加倍来进行转义,在反向格式中,反斜杠必须以转义格式加倍;细节如下。十六进制数字可以是大写或小写,并且在数字对之间允许空格(但不在数字对内,也不在起始\x
序列中)。十六进制格式与各种外部应用程序和协议兼容,转换速度比转义格式更快,因此首选使用。示例:
SELECT E'\\xDEADBEEF';
将一个字节数组转换为十六进制应该是一个理智的人(比如你自己)用来编写SQL文件生成器的任何语言都应该是微不足道的。