应直接使用pymysql替代mysql-connector-python,因其纯python实现可规避windows下c扩展导致的0xc0000005崩溃;需修改导入方式、连接调用及异常类型,并严格匹配python、pymysql与mysql三者版本兼容性。

直接换用 pymysql,别再碰 mysql-connector-python —— 它在 Windows 下调用 C 扩展时容易触发 0xC0000005 崩溃,不是配置问题,是二进制兼容性缺陷。
Windows 上 mysql-connector-python 进程崩溃(退出码 -1073741819)
这不是密码错、端口错或数据库名错,而是驱动底层访问内存越界。Python 脚本一执行 connect() 就静默退出,控制台只留一行 [Monitor:tool_start],说明进程被系统强制终止。
-
mysql-connector-python依赖本地编译的 C 模块,在某些 Windows 版本 + Python 3.12 组合下无法稳定加载 TLS 或 socket 相关符号 - Docker 内的
mysql命令能连,是因为它走的是纯客户端协议栈,和 Python 驱动无关 - 即使把
host改成127.0.0.1、关闭防火墙、重装驱动,都无法绕过这个底层冲突
pymysql 替换时必须改的三处代码
pymysql 是纯 Python 实现,没有 C 扩展,天然规避崩溃风险,但接口细节有差异:
- 导入方式:把
from mysql.connector import connect, Error改成import pymysql和from pymysql import Error as PyMySQLError - 连接调用:
connect(**config)→pymysql.connect(**config),注意参数名一致(database不能写成db) - 异常类型:原
Error要换成PyMySQLError,否则except Error会漏捕获
PyMySQL 版本与 Python/MySQL 的硬性匹配规则
装错版本照样报错,不是装了就能用:
- Python 3.6:必须用
pymysql==1.0.3,1.1.x会 SyntaxError - Python 3.12+:必须 ≥
1.1.2,否则缺zoneinfo或 TLS 初始化失败 - MySQL 8.0+:必须 ≥
1.0.3,否则报Authentication plugin 'caching_sha2_password' cannot be loaded - MySQL 5.7 及更早:
pymysql>=1.0.0都可,但0.9.3不支持 8.0 协议,别乱降级
Navicat / PyCharm 连得上但 Python 连不上?先查 MySQL 实例是否唯一
你看到的“表存在但查不到”,大概率是 Python 连到了一个隐藏的老 MySQL 实例(比如残留的 5.5 或 9.3),而 Navicat 连的是新装的 8.0。
- 在 Python 里执行
cursor.execute("SELECT VERSION()"),拿到实际连接的 MySQL 版本 - 打开 Windows 服务管理器(
services.msc),停掉所有带MySQL字样的服务 - 手动删干净
C:\Program Files\MySQL、C:\ProgramData\MySQL、C:\my.ini - 重启后只留一个 MySQL 服务,再试连接
版本匹配不是“装最新就行”,而是 Python 解释器、PyMySQL、MySQL 三者之间有明确的兼容边界;一旦跨过,不是报错,就是崩溃——后者更难排查。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











