使用pyodbc连接MySQL中文乱码求助:如何实现pymysql般正常显示
解决pyodbc连接MySQL查询中文乱码的问题
我来帮你搞定这个pyodbc中文乱码的问题!从你的情况来看,核心问题出在ODBC驱动类型和pyodbc的编码解码设置上——毕竟你用pymysql能正常显示,说明数据库本身的字符集配置是没问题的。
下面是具体的修复步骤:
1. 更换为Unicode类型的ODBC驱动
你当前用的是MySQL ODBC 8.0 ANSI Driver,这个驱动是为单字节编码设计的,对多字节的中文支持不佳。换成MySQL ODBC 8.0 Unicode Driver(如果没安装的话,确保你的MySQL ODBC驱动包包含这个版本),这是处理多字节字符的关键前提。
2. 调整连接字符串和pyodbc编码设置
修改你的连接代码,同时补充解码规则(只设置setencoding不够,读取数据时还需要明确指定解码方式):
import pyodbc # 改用Unicode驱动,去掉原连接字符串里的CHARSET=UTF8(Unicode驱动会自动处理Unicode交互) cn = pyodbc.connect( "DRIVER={MySQL ODBC 8.0 Unicode Driver};" "SERVER=localhost;" "PORT=3306;" "DATABASE=db;" "UID=root;" "PASSWORD=******;" "OPTION=3;" ) # 设置编码,适配Python3的Unicode字符串 cn.setencoding(encoding='utf-8') # 针对SQL字符类型设置解码规则,确保读取时用utf-8解码 cn.setdecoding(pyodbc.SQL_CHAR, encoding='utf-8') cn.setdecoding(pyodbc.SQL_WCHAR, encoding='utf-8') cursor = cn.cursor() # 执行查询 cursor.execute("select * from tc_lite;") print(cursor.fetchall())
为什么这样能解决问题?
- ANSI驱动会把字符串转换为系统默认的ANSI编码(比如Win7默认是GBK),而你的数据库存储的是UTF8编码的中文,读取时用GBK去解码UTF8内容,自然就会出现乱码。
- Unicode驱动会直接以Unicode格式和数据库交互,配合pyodbc的
setencoding和setdecoding设置,确保写入和读取时都用UTF8编码,和pymysql的处理逻辑对齐,就能正常显示中文了。
内容的提问来源于stack exchange,提问作者Joy Wang




