postgres bytea 字段的反向字节顺序

R. *_*tin 7 postgresql psql bytea

我目前正在处理一个包含以 bytea 格式存储的散列的表。然而,将散列转换为十六进制字符串会产生错误的字节顺序。例子:

SELECT encode(hash, 'hex') FROM mytable LIMIT 1;

Output: 1a6ee4de86143e81
Expected: 813e1486dee46e1a
Run Code Online (Sandbox Code Playgroud)

有没有办法颠倒所有条目的字节顺序?

Eva*_*oll 6

这是一种方法,但我永远不会这样做。在数据库的bytea列中存储字节没有任何问题。但是,我不会在数据库中争吵,如果我这样做了,我会使用,

  • 一个C 语言函数,或
  • 一些不需要我将输入分解为一组字节的花哨的程序语言。

这是 sql-esque 并且应该可以工作——这就是我们正在做的事情,

  1. 生成由一系列偏移量0 - (bytelength-1)组成的集合。
  2. 将这些偏移量映射到表示为十六进制字符串的字节。
  3. 字符串以相反的顺序聚合它们。

这是一个例子,

CREATE TABLE foo AS SELECT '\x813e1486dee46e1a'::bytea AS bar;

SELECT bar, string_agg(to_hex(byte), '') AS hash
FROM foo
CROSS JOIN LATERAL (
  SELECT get_byte(bar,"offset") AS byte
  FROM generate_series(0,octet_length(bar)-1) AS x("offset")
  ORDER BY "offset" DESC
) AS x
GROUP BY bar;
Run Code Online (Sandbox Code Playgroud)

两个笔记,

  1. 我们可能无法使用,offset因为它是保留的,但您明白了。
  2. 这假设您的哈希(上面的栏)是唯一的。