You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL中Bytea十六进制转十进制失败问题求助

PostgreSQL bytea转十进制的问题解决

核心问题

你得到的\x0015是bytea类型的输出,它实际是两个字节的二进制数据:高位0x00、低位0x15(十进制21)。之前的操作只解析了低位字节,得到15,但正确结果应该是把两个字节作为一个16位整数计算,即0*256 + 21 = 21。

之前操作出错的原因

  • 直接转int:bytea是二进制类型,PostgreSQL无法直接识别它对应的整数位数,因此报错
  • 转文本再转int:bytea转文本会生成带\x前缀的字符串,包含非数字字符,转int自然触发语法错误
  • 使用to_number:这个函数用于格式化数字文本,不适合解析二进制数据,结果必然错误
  • encode转十六进制后转int:如果直接把0015当十进制字符串转int,或者只截取了15部分,就会得到错误的15,正确做法是把十六进制字符串转为对应整数

正确转换方法

方法1:位串转换法

先把bytea转成十六进制字符串,拼接成PostgreSQL的十六进制字面量格式,再转成16位位串,最后转整数:

SELECT ('x' || encode("Data", 'hex'))::bit(16)::int FROM getlastvaluesnamed(你的参数);

如果你的bytea是其他长度(比如1字节),把bit(16)改成对应长度即可(如bit(8))。

方法2:字节手动计算法

如果确认是固定2字节的大端格式(高位在前),可以用get_byte函数逐个取字节计算:

SELECT (get_byte("Data", 0) << 8) + get_byte("Data", 1) FROM getlastvaluesnamed(你的参数);

get_byte从0开始计数,get_byte("Data",0)取高位字节,左移8位后加上低位字节,得到正确的十进制值21。

关于"Values"类型的补充

你找不到这个类型,是因为它是厂商自定义的复合类型,你可以用下面的语句确认"Data"字段的具体类型:

SELECT pg_typeof("Data") FROM getlastvaluesnamed(你的参数) LIMIT 1;

内容的提问来源于stack exchange,提问作者viktorkho

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 23:32:50