我有一个文本文件,其中包含多个十六进制字符串:
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
有什么想法,还是我处理错误的方法?
您可以使用decode函数将十六进制字符串转换为bytea (其中“ encoding”表示将二进制值编码为某些文本值)。例如:
decode
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()功能是一种合理的输入输入方式,即使其中涉及一些开销。
E'\xDE\xAD\xBE\xEF'
E'\\336\\255\\276\\357'::bytea
decode()