You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用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的setencodingsetdecoding设置,确保写入和读取时都用UTF8编码,和pymysql的处理逻辑对齐,就能正常显示中文了。

内容的提问来源于stack exchange,提问作者Joy Wang

火山引擎 最新活动