我有一个文本文件,里面有几个十六进制字符串:

013d7d16d7ad4fefb61bd95b765c8ceb
007687fc64b746569616414b78c81ef1

我想把它们作为bytea而不是varchar存储在数据库中.也就是说,我希望数据库将01存储为单字节00000001,而不是字符"0"1'.

我可以通过sed轻松运行这个文件,以任何方式格式化/转义它.

这就是我try 过的:

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

有什么 idea 吗,还是我处理问题的方式不对?

推荐答案

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

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

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

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

不能只说E'\xDE\xAD\xBE\xEF'是因为这是为了生成文本值,而不是字节,所以Postgresql将try 将其从客户端编码转换为数据库编码.你可以这样写bytea转义格式,但是你需要把反斜杠加倍:E'\\336\\255\\276\\357'::bytea.我想你可以明白为什么bytea的格式正在改变....虽然IMHO是一种合理的输入方式,但也有一种合理的输入方式.

Sql相关问答推荐

如何编写SQL查询,在2024年每月的第一个日期输出货币?

如何查询一个名称是根据PL/pgSQL函数结果构建的表?

如何在联接条件不匹配时按日期获取上一条记录

如果开始期间不存在PostgresSql回填数据

Lag()函数的差异:R与SQL(将R代码转换为SQL)

如何嵌套两条SQL语句

如何在SQL中更新Json字符串

最近3个月收到的邮箱总数

用户购买平台及金额统计

基于多参数的SQL Server条件过滤

如何在SQL中从多个查询进行分组

按两列分组,并根据SQL中的条件返回第三个列值

如何在Postgres中为单值输入多行?

如何使用jsonn_populate_record()插入到包含IDENTITY列的表中

显示所有组并计算给定组中的项目(包括 0 个结果)

如何对 jsonb 中的字段执行求和,然后使用结果过滤查询的输出

如何从一张表中获取值在至少三行相同的记录

根据开始时间和结束时间计算has_impact字段

在给定的日期范围内填写缺失的日期

创建一个将层次 struct 级别放入列中的查询