有效,但不能通过 encoding='utf-8' 参数设置;Python 3 默认使用 Unicode,MongoDB 原生支持 UTF-8,乱码主因是数据写入前编码错误或终端/Shell 显示误判。

连接MongoDB时指定UTF-8编码是否有效
直接在 MongoClient 连接字符串或参数里加 encoding='utf-8' 是无效的——pymongo 本身不接受该参数,Python 3 默认使用 Unicode 字符串,MongoDB Wire Protocol 也不走传统文本编码层。所谓“编码错误”,99% 是数据写入时就已损坏,或驱动/Shell 环境对非ASCII字节的显示误判。
常见报错现象和真实原因
看到类似 UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe4 in position 0 或控制台输出乱码(如 你好),通常不是读取阶段出错,而是:
- 原始数据以错误编码(如 GBK)写入 MongoDB 的
str字段,且未正确解码为 Pythonstr就存了bytes - 使用旧版 PyMongo(str 和
unicode - 终端或 IDE 控制台不支持 UTF-8(如 Windows cmd 默认 CP936),导致打印时变形,但实际
type(doc['name']) is str且内容正确
真正该检查和做的三件事
不要改连接参数,要从源头和消费端入手:
- 确认写入方:存数据前确保是 Python 3
str(不是bytes),例如collection.insert_one({'name': '你好'}),而非collection.insert_one({'name': b'你好'}) - 读取后如需转字节再编码,显式调用
.encode('utf-8');如用于 Web 输出,确认响应头Content-Type: text/html; charset=utf-8 - 调试时用
repr(doc['field'])查看真实值,比直接print()可靠——它会显示'你好'还是b'\xe4\xbd\xa0\xe5\xa5\xbd'
Windows cmd 下中文显示异常的临时解法
这不是 MongoDB 问题,但常被误认为是。若 print(doc['name']) 在 cmd 显示为乱码:
立即学习“Python免费学习笔记(深入)”;
- 运行
chcp 65001切换当前终端到 UTF-8 模式(需系统支持) - 更稳妥的是改用支持 UTF-8 的终端,如 Windows Terminal、VS Code 内置终端或 Git Bash
- 避免用
os.system('echo ...')中间转发中文,容易触发二次编码
核心在于:MongoDB 存的是 BSON,BSON 对字符串要求 UTF-8 编码,驱动自动处理编解码——只要写入的是合法 Python str,读出来就是干净的 str,中间没有可插手的“指定编码”环节。


















