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



数据库: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 Image文件。处理服务器上的请求的代码将接收一个字节数组,该字节数组包含PNG图像文件中的数据,并使用与此处解释的内容插入表中的记录。有很多示例关于如何将字节数组插入Internet上字节的类型字段中。这是一个简单的练习。插入代码的一个示例看起来像这样:

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

最简单的方法,imo表示SQL文件中的bytea数据是使用十六进制格式:

8.4.1。bytea hex格式

"十六进制"格式将二进制数据编码为每个字节的2个十六进制数字,首先是最重要的nibble。整个字符串之前是序列x(将其与逃生格式区分开)。在某些情况下,可能需要通过将其加倍来逃脱初始的后斜线,在同样的情况下,必须以逃生格式将后斜线加倍。详细信息如下。十六进制数字可以是上部或下情况,并且在数字对之间允许空格(但不在数字对或开始的x序列中)。十六进制格式与广泛的外部应用程序和协议兼容,并且它的转换速度比逃生格式更快,因此其使用是优选的。

示例:

SELECT E'\xDEADBEEF';

将一系列字节转换为十六进制,应该用理智的人(这样的人)用来编写SQL文件生成器的任何语言。

最新更新