Postgres:如何将bytea存储为hstore中的值?

时间:2015-04-23 21:36:09

标签: sql postgresql casting postgresql-9.3 hstore

我正在尝试将bytea存储为hstore中的值,并且我一直收到以下错误:

function hstore(unknown, bytea) does not exist

以下是我的尝试:

UPDATE users set store = store || hstore('key1', pgp_pub_encrypt('testval',dearmor('xxxx')));

2 个答案:

答案 0 :(得分:2)

  

我正在尝试将bytea存储为hstore中的值

如果没有某种编码,您无法安全地将bytea存储在hstore中,因为hstore在当前文本编码中存储为文本,但bytea没有文本编码并且还可能包含在文本字符串中不合法的空字节。

因此,您需要将bytea编码为hex,base64或其他一些形式,使其成为当前编码中的有效文本。

最简单的方法是将其转换为text,但我建议改为使用encodedecode来自/来自base64。此编码比PostgreSQL中用于text的文本表示的hexbytea编码更紧凑,并且它也独立于bytea_output设置的值。 / p>

e.g。

UPDATE users
SET store = store
    || hstore('key1', encode( pgp_pub_encrypt('testval',dearmor('xxxx'))), 'base64')
WHERE ... ;

答案 1 :(得分:1)

hstore() function采用数组有两种变体,一种采用行/记录,另一种采用两种text。最后一个是给你的:

SELECT hstore('foo','abc'::bytea::text);  -- cast bytea to text!

您的尝试未通过功能类型解析规则,因为从byteatext注册了显式强制转换。 Postgres回退到输入/输出转换,这不计入函数类型分辨率:

所以:

UPDATE users
SET    store = store
        || hstore('key1', pgp_pub_encrypt('testval',dearmor('xxxx'))::text)
WHERE ... ;