表达式中带有 sha() 函数的 Postgres 索引

Postgres index with sha() function in expression

postgres中的sha functions只接受bytea作为输入类型。

sha512 ( bytea ) → bytea
    Computes the SHA-512 hash of the binary string.
    sha512('abc'::bytea) → \xddaf35a193617abacc417349ae204131​12e6fa4e89a97ea20a9eeee64b55d39a​2192992a274fc1a836ba3c23a3feebbd​454d4423643ce80e2a9ac94fa54ca49f

问题是如果输入文本包含反斜杠(错误:invalid input syntax for type bytea ).我能找到将这样的字符串转换为 bytea 的唯一方法是这个函数:

convert_to ( string text, dest_encoding name ) → bytea
  Converts a text string (in the database encoding) to a binary string encoded in encoding dest_encoding (see Section 23.3.4 for available conversions).
  convert_to('some_text', 'UTF8') → \x736f6d655f74657874

但是这个函数不是不可变的,因此它不能用在像这样的UNIQUE INDEX中:

CREATE UNIQUE INDEX index_name ON public.table
  USING btree
  (
    (md5(message)), -- works
    (sha512(convert_to(message, 'UTF8'))) -- not immutable
  );

问题:如何在索引表达式中使用sha函数?我不想使用 md5.

双反斜杠:

CREATE UNIQUE INDEX index_name ON public.table
  USING btree
  (
    (sha512(replace(message, '\', '\')::bytea))
  );