将bigint转换为bytea,但交换字节顺序

Jun*_*ing 5 postgresql endianness bytea

我有一个PostgreSQL表,我想将列从bigint一个bytea字节改为字节以保存更多数据.我在想使用以下顺序:

  1. alter table mytable add new_column
  2. update mytable set new_column = int8send(old_column)
  3. alter table drop old_column
  4. alter table rename new_column to old_column

上述序列的工作,唯一的问题是,我想在字节序列bytea逆转.例如,如果一个值old_column0x1234567890abcdef,上面的序列会产生\0224Vx\220\253\315\357,但我希望它是 \357\315\253\220xV4\022.似乎结果bytea使用了来自原始的big-endian命令bigint.

没有编写程序,有没有一种简单的方法可以做到这一点?我swap64()在PostgreSQL中寻找一种功能但却找不到它.

Mik*_*ll' 0

这个功能虽然不完全是您正在寻找的功能,但应该可以帮助您顺利完成任务。

下面逐字复制了该函数的源代码。

CREATE OR REPLACE FUNCTION utils.int_littleendian(v_number integer) 
  RETURNS bytea AS 
$BODY$ 
DECLARE 
        v_textresult bytea; 
        v_temp int; 
        v_int int; 
        v_i int = 0; 
BEGIN 
        v_int = v_number; 
        v_textresult = '1234'; 
        WHILE(v_i < 4) LOOP 
                raise notice 'loop %',v_int; 
                v_temp := v_int%256; 
                v_int := v_int - v_temp; 
                v_int := v_int / 256; 
                SELECT set_byte(v_textresult,v_i,v_temp) INTO v_textresult; 
                v_i := v_i + 1; 
        END LOOP; 
        return v_textresult; 
END; 

$BODY$ 
  LANGUAGE 'plpgsql' VOLATILE 
  COST 100; 
Run Code Online (Sandbox Code Playgroud)