Python用psycopg2读取PostgreSQL的bytea列下载文件乱码如何解决
问题根因
你读取到的U0ZUUCBhZGRy....是标准Base64编码字符串,解码后对应文本开头为SFTP addr,和预期的txt内容匹配,说明拿到的不是文件原始二进制。触发场景分两种:
- 文件入库时未写入原始二进制,提前做了Base64编码转码后才存入bytea字段
- psycopg2连接未指定bytea输出格式,默认返回转码后的内容而非原始字节
修复步骤
快速验证
在现有代码中加入Base64解码逻辑,测试输出文件是否正常:
import psycopg2 import base64 connection = psycopg2.connect( dbname=dbname, host=host, port=port, user=user, password=password ) cursor = connection.cursor() query = "select c.file from my_table t where t.file_name = 'credentials.txt'" cursor.execute(query) data = cursor.fetchall() # 对读取到的内容做base64解码,得到原始文件字节 file_binary = base64.b64decode(data[0][0].tobytes()) with open('my_text.txt', 'wb') as f: f.write(file_binary)
运行后打开生成的my_text.txt,如果内容可读,说明定位正确。
长期修复
根据验证结果选对应方案即可:
- 若验证后文件正常,说明库中存储的就是Base64转码后的内容:后续上传文件时直接写入原始二进制,不要额外做Base64编码,读取时就不需要多步解码;存量数据可以批量做一次Base64解码后回写为原始二进制。
- 若验证后文件乱码,说明是psycopg2输出配置问题:创建数据库连接时增加bytea输出格式指定参数即可,修改后读取到的内容直接是原始字节,无需额外解码:
connection = psycopg2.connect( dbname=dbname, host=host, port=port, user=user, password=password, options="-c bytea_output=escape" )
内容的提问来源于stack exchange,提问作者Lau
相关产品推荐
相关产品推荐

