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

mel*_*ose 6 postgresql base64

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

>>> base64.b64encode('1111')
'MTExMQ=='
Run Code Online (Sandbox Code Playgroud)

现在,当我尝试在Postgresql中对其进行解码时,我得到了十六进制值而不是原始字符串。

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

   decode   
------------
 \x31313131
Run Code Online (Sandbox Code Playgroud)

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

Thi*_*ilo 10

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

select convert_from(decode('MTExMQ==', 'base64'), 'UTF8')  
Run Code Online (Sandbox Code Playgroud)

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

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


a_h*_*ame 9

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

您看到的格式是 a 的默认文本表示,bytea例如psql在显示bytea值时使用。其他 SQL 客户端可能会以不同的方式显示。

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

select encode('\x31313131', 'base64');
Run Code Online (Sandbox Code Playgroud)

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

set bytea_output to 'escape';
select decode('MTExMQ==', 'base64')::text;
Run Code Online (Sandbox Code Playgroud)

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