使用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
相关产品推荐
相关产品推荐

