如何在PostgreSQL中将整数解包为浮点数?
我正在使用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) 你不能把位数据类型转换为浮点数据类型。(不过,你可以把位数据类型转换为整数。)