我有一个PostgreSQL表,我想将一列从bigint
更改为bytea
字节,以容纳更多数据。
alter table mytable add new_column
update mytable set new_column = int8send(old_column)
alter table drop old_column
alter table rename new_column to old_column
上面的序列可以工作,唯一的问题是我希望bytea
中的字节序列是 reversed。例如,如果old_column
中的值是0x1234567890abcdef
,上面的序列将生成\0224Vx\220\253\315\357
,但我希望它是\357\315\253\220xV4\022
。看起来结果bytea
使用了来自原始bigint
的big-endian顺序。
有没有不写程序就能做到这一点的简单方法?我在PostgreSQL中寻找swap64()
排序的函数,但没有找到。
4条答案
按热度按时间mnowg1ta1#
使用十六进制表示的regexp提取,可以不用plpgsql代码进行字节交换。下面是交换bigint常量的示例,假设
SET standard_conforming_strings to ON
(PG 9.1的默认值)它返回
cdab896745230100
,然后应用decode(value, 'hex')
将其转换为bytea。整个类型转换实际上可以在单个SQL语句中完成:
gcuhipw92#
下面是我编写的一个纯SQL函数,用于反转
bytea
类型值的字节顺序:我昨天才写的,所以它没有经过很好的测试和优化,但是看起来可以工作,至少在长度为1k的字节字符串上是这样。
jtw3ybtb3#
我现在正在使用
pageinspect
module,我也很好奇如何更改现有bytea值的字节顺序,这与您的情况非常匹配。我提出了以下函数:
它非常简单,工作原理类似于文本
reverse()
函数:7uhlpewt4#
This function,虽然不是您想要的,但应该可以帮助您继续前进。
该函数的源代码逐字转载如下。