You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python 3.8插入原始PNG图片至数据库时遭遇codec无法解码字节0x89错误的技术求助

解决Python中PNG图片插入SQL时的解码错误问题

你遇到的codec can't decode byte 0x89错误根源很明确:PNG是二进制文件,不能用UTF-8文本编码打开。你的代码里犯了两个关键错误:重复打开文件,且第二次用文本模式读取二进制内容,导致Python尝试把非UTF-8的二进制字节当成文本解码,自然失败。

错误代码的问题拆解

  • 你先用rb模式打开了文件,但没使用这个句柄,反而又用encoding="UTF-8"打开一次——这完全没必要,而且文本模式会强制解码二进制数据,PNG开头的0x89不属于UTF-8的有效字符,直接触发解码错误。
  • 就算你成功读取了内容,直接把二进制数据拼接到SQL字符串里也会导致类型冲突,还会引入SQL注入风险。

正确的实现方式

正确的做法是用二进制模式读取图片,然后通过参数化查询把二进制数据传递给SQL语句——参数化查询不仅能避免编码问题,还能彻底杜绝SQL注入。

以下是修正后的代码:

# 用二进制模式读取图片内容
with open(filename, "rb") as imageFile:
    image_binary = imageFile.read()

# 使用参数化查询(注意:不同数据库驱动的占位符可能不同,比如MySQL用%s,SQLite用?)
insert_sql = "INSERT INTO T_DOCUMENT (BINCONTENT, DOCNAME) VALUES (%s, %s)"
# 把二进制数据和文件名作为参数传入Execute方法
repo.Execute(insert_sql, (image_binary, '.png'))

关键说明

  1. 二进制读取:rb模式会直接读取文件的原始字节,不会尝试解码,完美保留PNG的二进制内容。
  2. 参数化查询:让数据库驱动自动处理二进制数据的转义和存储,不需要你手动拼接字符串,既安全又避免了编码错误。

如果你的数据库驱动(比如pyodbc、psycopg2等)使用的占位符不是%s,可以对应替换成驱动要求的格式(比如SQL Server用?,PostgreSQL用%s)。

内容的提问来源于stack exchange,提问作者user10641522

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 15:07:30