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

使用mysql.connector连接MySQL 5.7.17创建游标报'Unread result found'

问题:连接MySQL 5.7.17时调用cursor()抛出'Unread result found'异常

环境与现象

  • 两台MySQL服务器:旧版本5.7.17(仅支持TLSv1、TLSv1.1),新版本8.0.12(支持TLSv1、TLSv1.1、TLSv1.2)
  • Python脚本连接新版本数据库操作正常,但连接旧版本后,调用database.cursor()时直接抛出Unread result found异常,报错阶段早于fetchone/fetchall执行
  • 尝试设置cursor(buffered=True/False)参数均无法解决问题

示例代码

try:
    database = mysql.connector.connect(
        user="...", 
        password="...", 
        database="...", 
        host="...", 
        port=3306, 
        autocommit=True
    )
except mysql.connection.Error as err:
    print(err.msg)
    exit(1)

try:
    print("A")
    cursor = database.cursor() # 无论设置buffered参数都无效
    print("B")
    cursor.execute("SELECT * FROM some_table;")
    print("C")
    data = cursor.fetchall()
except mysql.connector.Error as err:
    print("D")
    print(err.msg)

控制台仅输出A、D及错误信息,代码未执行到cursor.execute阶段。

回溯信息

Traceback (most recent call last):
  File "/mnt/c/Users/{removed}/Desktop/{removed}/{removed}/./dumpToFile", line 155, in <module>
    row_count = cm.{removed function name}(attribute, single_day, mdb, sdb)
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/mnt/c/Users/{removed}/Desktop/{removed}/{removed}/conv_methods.py", line 298, in {removed function name}
    mysql_cursor = mdb.cursor(buffered=True)
                   ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/mysql/connector/connection.py", line 868, in cursor
    self.handle_unread_result()
  File "/usr/lib/python3/dist-packages/mysql/connector/connection.py", line 1132, in handle_unread_result
    raise errors.InternalError("Unread result found")
mysql.connector.errors.InternalError: Unread result found

限制条件

暂不考虑更换mysql.connector库,避免重写整个应用。


解决方案

1. 清理连接中遗留的未读结果

异常触发在cursor()方法,说明当前数据库连接中存在未读取的结果集(可能是之前复用连接时的操作遗留)。在创建新游标前手动清理:

# 在调用cursor()前添加这段代码
if database.unread_result:
    dummy_cursor = super(type(database), database).cursor()
    dummy_cursor.fetchall()
    dummy_cursor.close()

2. 重置连接会话状态

如果存在连接复用的情况,创建新游标前显式重置会话,清除之前的操作残留:

database.reset_session()
cursor = database.cursor(buffered=True)

同时确保每次使用游标后关闭:

# 操作完成后关闭游标
cursor.close()

3. 适配旧服务器TLS版本

旧服务器仅支持低版本TLS,可在连接时指定兼容的TLS版本和加密套件:

database = mysql.connector.connect(
    user="...", 
    password="...", 
    database="...", 
    host="...", 
    port=3306, 
    autocommit=True,
    ssl_cipher='DEFAULT@SECLEVEL=1',
    tls_versions=['TLSv1', 'TLSv1.1']
)

4. 降级mysql.connector版本

若上述方法无效,尝试降级驱动到与MySQL 5.7.17更兼容的版本(比如8.0.20之前的版本),新版本驱动对旧MySQL服务器的兼容性处理可能存在变化。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 01:34:51