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

Django连接AWS RDS MySQL出现UnicodeDecodeError错误如何解决

排查步骤与解决方案

1. 先确认系统与连接编码是否生效

  • 登录第二台EC2执行locale命令,检查系统默认编码是否为UTF-8,如果不是,修改/etc/default/locale配置,将LC_ALL、LANG均设置为en_US.UTF-8(或对应中文UTF-8编码),重启实例生效。Ubuntu 20.04的默认locale配置异常会覆盖MySQL连接的默认编码,是高频触发原因。
  • 在Django的数据库配置OPTIONS中补充两个参数,强制指定连接行为:
'OPTIONS': {
    'charset': 'utf8mb4',
    'use_unicode': True,
    'init_command': "SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci"
}

2. 处理依赖包版本的解码逻辑差异

旧版本mysqlclient==1.3.10对非法UTF-8字节默认采用替换容错逻辑,不会抛出错误,而2.0+版本默认开启严格解码,遇到非法字节直接报错。如果不想修改存量数据,可以在数据库配置中临时覆盖解码规则作为兜底:

import MySQLdb.constants
'OPTIONS': {
    'charset': 'utf8mb4',
    'conv': {
        MySQLdb.constants.FIELD_TYPE.STRING: lambda x: x.decode('utf8', 'replace'),
        MySQLdb.constants.FIELD_TYPE.VAR_STRING: lambda x: x.decode('utf8', 'replace'),
        MySQLdb.constants.FIELD_TYPE.TEXT: lambda x: x.decode('utf8', 'replace')
    }
}

该配置会将所有非法UTF-8字节替换为�,不会中断业务运行。

3. 清理存量脏数据

报错提示的0xa0是Latin1编码的不间断空格,属于历史脏数据,大概率是早期入库时没有做编码校验写入的。你可以定位到对应表的脏记录后批量修复:

  1. 先执行SQL找到含非法字节的记录,把表名、字段名替换为你MyModel对应的表和文本字段:
SELECT * FROM 表名 WHERE 字段名 LIKE CONCAT('%', 0xA0, '%');
  1. 批量替换脏字符为普通空格:
UPDATE 表名 SET 字段名 = REPLACE(字段名, 0xA0, ' ');

本地运行正常的原因说明

Mac端的MySQL 8.0客户端默认自带编码容错逻辑,连接时会自动兼容非法字节,所以不会触发报错,和服务器端的严格模式行为不一致。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 16:54:01