5

我正在尝试使用 Postgresql encode() 函数并将其他一些函数作为它的参数。我得到错误,我不明白为什么。

我在 Windows 上使用 Postgres 9.6.14。

  1. 这工作正常并返回698d51a19d8a121ce581499d7b701668
select md5('111'); 
  1. 这也可以正常工作并返回一些值
select encode('698d51a19d8a121ce581499d7b701668', 'base64');
  1. 但这一个结合了前两个,不起作用并返回"ERROR: function encode(text, unknown) does not exist"
select encode(md5('111'), 'base64');
  1. 这也不起作用并返回相同的错误
select encode(concat('1', '11'), 'base64');
  1. 我认为有一条规则可以防止在另一个函数中使用一个函数,但是下面的一个可以正常工作并返回与此处的第一个请求相同的值,正如预期的那样。
select md5(concat('1', '11'))

那么,3 号和 4 号请求以及encode()整体功能有什么问题?

4

1 回答 1

3

看看 的定义encode

\df encode
                          List of functions
   Schema   |  Name  | Result data type | Argument data types | Type 
------------+--------+------------------+---------------------+------
 pg_catalog | encode | text             | bytea, text         | func
(1 row)

第一个参数必须是bytea,即二进制字节字符串。

您的前两个查询有效,因为字符串文字是 type unknown,可以bytea隐式转换为。

在不起作用的查询中,您正在使用函数md5concat,它们都具有text作为结果类型。text现在and之间没有隐式转换bytea,因此出现错误消息。

为了使这项工作,您必须引入显式类型转换:

select encode(CAST(md5('111') AS bytea), 'base64');
于 2019-07-04T11:46:40.013 回答