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

Python MySQL-Connector插入超3000字符TEXT类型数据超时断连问题

故障根因
  • 大概率是传输链路中间的限制(共享VPS出站规则、MySQL服务端的max_allowed_packet参数过小、中间NAT/防火墙的大包拦截)导致超过3000字符的报文无法正常传输,连接被主动切断或超时
  • 排除字段类型问题:MySQL TEXT类型最大支持65535字节存储,4000字符远未到上限
可行解决方案

按实施难度从低到高排序:

方案1:调整连接参数+服务端配置(优先尝试)

Python端连接参数调整

在原有连接代码中新增3个参数:

import mysql.connector

try:
    mydb = mysql.connector.connect(
        host="", 
        user="", 
        password="", 
        database="", 
        connection_timeout=30, # 拉长超时阈值
        max_allowed_packet=16*1024*1024, # 显式声明最大允许传输包为16M
        compress=True # 开启传输压缩,大幅降低大文本的传输体积
    )
    mycursor = mydb.cursor()
except Exception as e:
    print(e)

MySQL服务端配置调整

登录Linux服务器,编辑MySQL配置文件(通常路径为/etc/my.cnf或/etc/mysql/mysql.conf.d/mysqld.cnf),在[mysqld]段落新增如下配置:

max_allowed_packet = 16M
wait_timeout = 60
interactive_timeout = 60

修改完成后重启MySQL服务生效:
systemctl restart mysql(Debian/Ubuntu)或systemctl restart mysqld(CentOS/RHEL)

方案2:分块追加写入(无需改配置,兼容性最好)

如果中间链路强制限制了单次请求的包大小,无法通过配置修改,可以采用先插占位记录、再分块更新追加的方式实现长文本写入,单条记录完全支持该操作:

# 第一步:插入空占位记录,获取记录ID
sql_init = "INSERT INTO tableName (experience) VALUES (%s)"
mycursor.execute(sql_init, ("",))
mydb.commit()
record_id = mycursor.lastrowid

# 第二步:将长文本按2000字符切块,循环追加写入
long_text = "你的4000+字符长文本"
chunk_size = 2000 # 小于已验证正常的3000阈值即可
for i in range(0, len(long_text), chunk_size):
    current_chunk = long_text[i:i+chunk_size]
    sql_append = "UPDATE tableName SET experience = CONCAT(experience, %s) WHERE id = %s"
    mycursor.execute(sql_append, (current_chunk, record_id))
    mydb.commit()

方案3:排查链路限制

如果以上方案都无效,按顺序排查:

  • 检查长文本中是否存在特殊转义字符,可先做base64编码后再写入验证
  • 检查Linux端MySQL服务器的防火墙、安全组规则,是否拦截了大于特定大小的TCP报文
  • 联系共享Windows VPS服务商,确认是否存在出站报文大小限制、TCP连接时长限制

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 07:54:02