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

