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

axi*_*sty 2 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);
Run Code Online (Sandbox Code Playgroud)

我希望能够以两种方式将记录插入到这个表中。

行插入表中的第一种(也是最常见的)方式是用户将通过 html 文件上传表单提供 PNG 图像文件。在服务器上处理请求的代码将接收一个包含 PNG 图像文件中数据的字节数组,并使用与此处解释的内容非常相似的内容在表中插入一条记录。互联网上有很多关于如何将字节数组插入到 bytea 类型的 postgresql 字段的示例。这是一个简单的练习。插入代码的示例如下所示:

insert into logos (id, bytes, type, created) values (?, ?, ?, now()) 
Run Code Online (Sandbox Code Playgroud)

并且字节将设置为:

...
byte[] bytes = ... // read PNG file into a byte array.
...
ps.setBytes(2, bytes);
...
Run Code Online (Sandbox Code Playgroud)

行插入表中的第二种方式将来自纯文本文件脚本。需要这样做的原因只是为了将测试数据填充到表中以进行自动化测试,或者为远程开发环境用一些记录初始化数据库。

无论数据如何输入到表中,应用程序显然都需要能够从表中选择 bytea 数据并将其转换回 PNG 图像。


如何正确编码字节数组,以便能够从脚本中插入数据,以便仅将文件中包含的原始字节存储在数据库中?

我可以编写代码来读取文件并吐出插入语句来填充脚本。但我不知道如何对纯文本脚本的字节数组进行编码,以便从 psql 运行脚本时,图像数据将与使用setBytesjdbc 代码插入文件时相同。

我想用这样的东西运行脚本:

psql -U username -d dataBase -a -f test_data.sql
Run Code Online (Sandbox Code Playgroud)

mu *_*ort 5

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

8.4.1. bytea 十六进制格式

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

例子:

SELECT E'\\xDEADBEEF';
Run Code Online (Sandbox Code Playgroud)

将字节数组转换为十六进制应该是正常人(例如您自己)用来编写 SQL 文件生成器的任何语言中的微不足道的。