我正在尝试将bytea
存储为hstore
中的值,并且我一直收到以下错误:
function hstore(unknown, bytea) does not exist
以下是我的尝试:
UPDATE users set store = store || hstore('key1', pgp_pub_encrypt('testval',dearmor('xxxx')));
答案 0 :(得分:2)
我正在尝试将bytea存储为hstore中的值
如果没有某种编码,您无法安全地将bytea
存储在hstore
中,因为hstore
在当前文本编码中存储为文本,但bytea
没有文本编码并且还可能包含在文本字符串中不合法的空字节。
因此,您需要将bytea编码为hex,base64或其他一些形式,使其成为当前编码中的有效文本。
最简单的方法是将其转换为text
,但我建议改为使用encode
和decode
来自/来自base64。此编码比PostgreSQL中用于text
的文本表示的hex
或bytea
编码更紧凑,并且它也独立于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!
您的尝试未通过功能类型解析规则,因为从bytea
到text
注册了无显式强制转换。 Postgres回退到输入/输出转换,这不计入函数类型分辨率:
所以:
UPDATE users
SET store = store
|| hstore('key1', pgp_pub_encrypt('testval',dearmor('xxxx'))::text)
WHERE ... ;