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
相关产品推荐
相关产品推荐

