如何使用纯文本脚本插入(来自文件数据的原始字节)

时间:2014-02-06 02:03:14

标签: postgresql character-encoding

数据库: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

1 个答案:

答案 0 :(得分:3)

在IM文件中表示bytea数据的最简单方法是使用hex format

  

<强> 8.4.1。 bytea十六进制格式

     

“十六进制”格式将二进制数据编码为每个字节2个十六进制数字,最重要的是半字节数字。整个字符串前面是序列\x(以区别于转义格式)。在某些情况下,初始反斜杠可能需要通过加倍来进行转义,在反向格式中,反斜杠必须以转义格式加倍;细节如下。十六进制数字可以是大写或小写,并且在数字对之间允许空格(但不在数字对内,也不在起始\x序列中)。十六进制格式与各种外部应用程序和协议兼容,转换速度比转义格式更快,因此首选使用。

     

示例:

SELECT E'\\xDEADBEEF';

将一个字节数组转换为十六进制应该是一个理智的人(比如你自己)用来编写SQL文件生成器的任何语言都应该是微不足道的。