admin

将十六进制文本字符串作为bytea插入PostgreSQL

sql

我有一个文本文件,其中包含多个十六进制字符串:

013d7d16d7ad4fefb61bd95b765c8ceb
007687fc64b746569616414b78c81ef1

我想将这些作为 BYtea (而不是 varchar) 存储在数据库中。也就是说,我希望数据库将01存储为单字节00000001,而不是字符“
0”和“ 1”。

我可以通过sed轻松运行此文件,以任何需要的方式对其进行格式化/转义。

这是我尝试过的:

create table mytable (testcol BYTEA);

这有效:

insert into mytable (testcol) values (E'\x7f\x7f');

但是,一旦我有一个高于\ x7f的字节,就会出现此错误:

insert into mytable (testcol) values (E'\x7f\x80');
ERROR:  invalid byte sequence for encoding "UTF8": 0x80

有什么想法,还是我处理错误的方法?


阅读 358

收藏
2021-05-10

共1个答案

admin

您可以使用decode函数将十六进制字符串转换为bytea (其中“ encoding”表示将二进制值编码为某些文本值)。例如:

select decode('DEADBEEF', 'hex');
      decode      
------------------
 \336\255\276\357

9.0的默认输出更容易理解:

   decode   
------------
 \xdeadbeef

您不能只说这E'\xDE\xAD\xBE\xEF'是因为它是为了生成文本值,而不是字节数,因此Postgresql会尝试将其从客户端编码转换为数据库编码。您可以这样编写bytea转义格式,但需要将反斜杠加倍:E'\\336\\255\\276\\357'::bytea。我想您可以理解为什么更改了BYTEA格式。…恕我直言,该decode()功能是一种合理的输入输入方式,即使其中涉及一些开销。

2021-05-10