You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用pyodbc(4.0.23)从Python3连接MySQL报错,Python2可正常运行

Python3下pyodbc连接MySQL报错的解决方案

我之前也碰到过Python版本切换后pyodbc连接MySQL的兼容性问题,给你梳理下原因和解决办法:

首先还原你的问题场景:

你的代码(Python2正常运行)

import pyodbc

_protocal = 'DRIVER={/usr/local/lib/libmyodbc5.so};SERVER=127.0.0.1; PORT=3306;DATABASE=learn;UID=root;PASSWORD=root'
conn = pyodbc.connect(_protocal)
cursor = conn.cursor()
test_sql = 'select * from students'
cursor.execute(test_sql)

Python3下的报错(截取关键部分)

Traceback (most recent call last):
File "temp.py", line 82, in
main()
File "temp.py", line 71, in main
conn = pyodbc.connect(_protocal)
...(后续报错通常和字符串编码、驱动参数不兼容有关)

问题核心原因

Python2和Python3在字符串处理上有本质区别:

  • Python2的str是字节串,pyodbc对参数的编码要求比较宽松
  • Python3的str是Unicode字符串,pyodbc对连接参数的编码、格式要求更严格,且旧版本的MySQL ODBC驱动(比如你用的libmyodbc5.so)对Python3的兼容性较差

具体解决步骤

1. 给连接字符串添加字符编码参数

在连接串末尾加上CHARSET=utf8(或utf8mb4,支持emoji等特殊字符),强制指定编码,避免Python3下的编码不匹配,同时注意去掉参数前后的空格(避免解析异常):

import pyodbc

_protocal = 'DRIVER={/usr/local/lib/libmyodbc5.so};SERVER=127.0.0.1;PORT=3306;DATABASE=learn;UID=root;PASSWORD=root;CHARSET=utf8'
conn = pyodbc.connect(_protocal)
cursor = conn.cursor()
test_sql = 'select * from students'
cursor.execute(test_sql)

# 测试获取结果
for row in cursor.fetchall():
    print(row)

conn.close()

2. 升级MySQL ODBC驱动到兼容Python3的版本

libmyodbc5是比较老旧的驱动,建议替换为MySQL ODBC 8.0 Driver(对应文件通常是libmyodbc8.so),它对Python3的兼容性更好。替换后修改连接串中的DRIVER路径即可:

_protocal = 'DRIVER={/usr/local/lib/libmyodbc8.so};SERVER=127.0.0.1;PORT=3306;DATABASE=learn;UID=root;PASSWORD=root;CHARSET=utf8'

3. 确认pyodbc版本适配Python3

执行pip install --upgrade pyodbc,确保安装的是支持Python3的pyodbc版本(建议2.0以上)。

4. 排查驱动是否被正确识别

可以先运行以下代码查看pyodbc能识别的驱动列表,确认你的驱动路径是否正确:

import pyodbc
print(pyodbc.drivers())

如果你的驱动不在列表里,可能需要检查驱动的安装路径,或者重新安装驱动。

内容的提问来源于stack exchange,提问作者Jhon Smith

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:01:51