如何在PostgreSQL中将整数解包为浮点数?

1 投票
2 回答
1483 浏览
提问于 2025-04-16 11:11

我正在使用Python的struct.pack函数,把各种数据类型打包成一个通用的32位整数,存储在PostgreSQL数据库里。这样做的缺点是,我不能直接在数据库里对这些值进行操作,必须在Python中用struct.unpack来解包数据,才能知道它代表什么。

如果我把一个32位的浮点数打包到这个字段里,有没有办法让PostgreSQL帮我进行转换呢?

我试过这样做,但没有成功:

select cast(cast(value as bit(32)) as float4) ...

它能成功把整数转换为bit(32),但不能把这个转换回浮点数。

2 个回答

4

你可能不想听的一个答案:别这么做。

这违反了基本原则:数据库里的值应该是原子性的,也就是说,不能再拆分成其他值。数据库的所有操作(我强调一下,是所有)都是为了处理单个值而设计的。你在这里是在“和框架对着干”。

即使你能做到,这样做也会拖慢性能。而且数据库的数据不容易被报告,不仅仅是你现在遇到这个问题,以后无论出于什么原因读取这些数据,都会碰到同样的问题。

好吧,我不想多说了,就这些。

1

最简单的解决办法,我相信你考虑过但放弃了,就是把32位浮点数存储在一个定义为使用32位浮点数据类型的列里。

使用CAST()函数是行不通的,因为a) CAST()对C语言的结构体、字节顺序或者填充字节都不了解,b) 你不能把位数据类型转换为浮点数据类型。(不过,你可以把位数据类型转换为整数。)

撰写回答