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'))
关键说明
- 二进制读取:
rb模式会直接读取文件的原始字节,不会尝试解码,完美保留PNG的二进制内容。 - 参数化查询:让数据库驱动自动处理二进制数据的转义和存储,不需要你手动拼接字符串,既安全又避免了编码错误。
如果你的数据库驱动(比如pyodbc、psycopg2等)使用的占位符不是%s,可以对应替换成驱动要求的格式(比如SQL Server用?,PostgreSQL用%s)。
内容的提问来源于stack exchange,提问作者user10641522
相关产品推荐
相关产品推荐

