mysql写入中文或emoji报错的根源是字符集未统一为utf8mb4,需在连接、建表、解码、sql绑定四环节分别配置charset='utf8mb4'并验证。

MySQL连接时没指定utf8mb4编码
Python爬虫写入中文或emoji时抛出 UnicodeEncodeError 或 1366: Incorrect string value,大概率是MySQL客户端连接没声明用 utf8mb4。MySQL的 utf8 实际只支持最多3字节的字符(不包含emoji和部分生僻汉字),而 utf8mb4 才是真正的UTF-8实现。
实操建议:
- 用
pymysql时,在connect()中显式传参:charset='utf8mb4'、collation='utf8mb4_unicode_ci' - 用
mysql-connector-python时,必须加charset='utf8mb4',否则默认用latin1 - 检查数据库、表、字段的字符集是否真为
utf8mb4:执行SHOW CREATE TABLE your_table;,确认输出里含CHARSET=utf8mb4
CREATE TABLE语句漏掉字符集声明
即使连接用了 utf8mb4,如果建表时没指定,MySQL会按库级默认字符集走——而很多老库默认是 utf8 或 latin1,导致字段实际不支持四字节字符。
Python 3.14.2是Python编程语言在2025年12月5日发布的稳定版本,属于3.14系列的第二个维护更新。该版本包含了18项修复,重点解决了多进程、数据类及正则表达式等模块的回归问题,并修复了CVE-2025-12084等安全漏洞。此版本标志着自由线程模式(移除GIL)正式获得官方支持,是Python发展的重要里程碑。
实操建议:
- 建表务必显式声明:
CREATE TABLE t (name VARCHAR(255)) CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; - 已有表可批量修复:
ALTER TABLE your_table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - 注意:
ALTER TABLE ... CONVERT TO会锁表,生产环境慎用;小表可直接执行,大表建议用pt-online-schema-change
Python字符串本身含非法字节序列
爬虫拿到的响应内容可能因网页声明与实际编码不一致(比如HTML里写 <meta charset="gbk"> 浣嗘湇鍔″櫒鍙戠殑鏄疷TF-8锛夛紝瀵艰嚧 .text 瑙g爜鍑洪敊锛屽悗缁
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










