在Postgresql中如何将base64解码值作为字符串而不是十六进制表示?

时间:2017-11-14 09:57:07

标签: postgresql base64

在Python中,我编码了一个字符串,

>>> base64.b64encode('1111')
'MTExMQ=='

现在当我尝试在Postgresql中解码它时,我得到的是Hex值而不是原始字符串。

=# select decode('MTExMQ==', 'base64');

   decode   
------------
 \x31313131

如何在Postgresql中没有任何更改的情况下获取原始字符串?

2 个答案:

答案 0 :(得分:6)

您可以使用convert_from将二进制数据转换为varchar:

select convert_from(decode('MTExMQ==', 'base64'), 'UTF8')  

但请注意,如果输入实际上是二进制数据(而不是某些文本),例如图像文件,则这可能是有损的(或失败)。

不需要在Postgresql中存储Base64编码的数据。您可以使用其中一种二进制列类型并直接存储数据(更紧凑)。

答案 1 :(得分:2)

decode()返回一个字节数组(bytea)而不是"十六进制字符串"。

您看到的格式是bytea的{​​{3}},例如psql显示bytea值时使用的值。其他SQL客户端可能以不同方式显示。

要将字节数组转换为可读字符串,您需要使用encode()

select encode('\x31313131', 'base64');

如果您将bytea_output更改为escape,然后将结果转换为text,您可以实现相同的目标:

set bytea_output to 'escape';
select decode('MTExMQ==', 'base64')::text;

如果您使用psql,则不需要演员。