必须在python连接mysql时显式指定charset='utf8mb4',并确保数据库、表、字段字符集及服务端配置均为utf8mb4_unicode_ci,四层统一才能正确存储和读取中文及emoji。

MySQL连接时没指定charset,插入中文就报UnicodeEncodeError
这是最常见的情况:Python默认用UTF-8编码,但MySQL连接没声明字符集,服务器可能用latin1或utf8mb4以外的默认值,导致写入失败或乱码。
解决方法很简单——在创建连接时显式传入charset='utf8mb4'(注意不是utf8):
import pymysql
conn = pymysql.connect(
host='localhost',
user='root',
password='123',
database='testdb',
charset='utf8mb4', <!-- 关键 -->
cursorclass=pymysql.cursors.DictCursor
)
-
utf8mb4才是MySQL对完整UTF-8(含emoji、生僻汉字)的真正支持,utf8只是阉割版(最多3字节) - 如果用
mysql-connector-python,参数名是charset;用SQLAlchemy则在URL里加?charset=utf8mb4 - 只设连接层还不够——数据库、表、字段的字符集也得统一为
utf8mb4_unicode_ci,否则仍可能出问题
建表时用utf8而非utf8mb4,查出来字段值变成None或乱码
即使连接指定了charset='utf8mb4',如果表结构本身是CHARSET=utf8,MySQL在返回数据时会按旧规则截断或转换,Python拿到的就是损坏的字节流,有时表现为None,有时是问号或乱码。
检查并修正表字符集:
SkillSub Pro - Python 题解与代码注释双功能技能功能概述SkillSub Pro - Python 题解与代码注释双功能技能是一项面向实际任务的技能,主要用于SkillSub Pro 是一个 Python 题解生成与代码注释的 双功能合体技能 ,专为学生、算法学习者和开发者设计;✅ 一个技能,两种用途 :;核心要点📝 题解模式 :输入题目/题号,自动生成完整 Python 题解(含详细注释、解题思路、复杂度分析);💬 注释模式 :输入 Python 代码,自动添加详细中。它将相关步骤、
SHOW CREATE TABLE users;
若看到DEFAULT CHARSET=utf8,立刻改掉:
ALTER TABLE users CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- 别只改
CHARACTER SET,必须同步指定COLLATE,否则排序和比较行为可能异常 -
CONVERT TO会重写所有字段,包括TEXT、VARCHAR等,确保全文本字段都生效 - 已有数据不会丢失,但若原内容含4字节UTF-8字符(如某些emoji),而表之前是
utf8,那些字符早已被静默截断——此时需从备份恢复
Python读取MySQL结果后,str对象打印正常,但写入文件或HTTP响应就乱码
这说明数据在Python内部是正常的(type(s) == str,且len(s.encode('utf8'))合理),问题出在后续输出环节。
- 写文件时没指定
encoding='utf-8':open('out.txt', 'w', encoding='utf-8'),否则默认用系统编码(Windows上常是gbk) - Flask/Django响应头缺失
Content-Type: text/html; charset=utf-8,浏览器按ISO-8859-1解析 - 终端环境不支持UTF-8(如某些Windows CMD未执行
chcp 65001),但这种情况现在少见,优先排查前两项
用pandas.read_sql读取含中文字段,结果列名或值全是
这不是pandas的问题,而是底层sqlalchemy或数据库驱动没正确传递字符集。pandas本身不处理编码,它依赖DBAPI返回的字符串。
- 确认连接字符串包含
?charset=utf8mb4(SQLAlchemy)或connect_args={'charset': 'utf8mb4'} - 如果用
pyodbc连MySQL,需在DSN里加CHARSET=UTF8(大小写敏感,且必须大写UTF8) - 极少数情况是MySQL服务端
my.cnf里skip-character-set-client-handshake被启用,强制忽略客户端请求——删掉这行再重启MySQL
字符集问题从来不是单点故障,它是连接、服务端配置、表结构、应用输出四层共同作用的结果。漏掉任何一层,都可能让utf8mb4形同虚设。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










