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

Python使用mysql-connector插入含换行符字符串报错及保留格式问题

解决MySQL插入带换行符文本报错且保留原始格式的方法

错误原因分析

  • 首次插入报错是因为MySQL驱动/服务端检测到未正确转义的控制字符(ASCII 10就是换行符\n),触发了非法字符校验
  • 用json.dumps处理后虽然能插入,但该方法会给字符串前后额外拼接JSON格式要求的双引号,还会转义内部特殊字符,导致存储结果不符合预期,该方法本身就不适用于SQL参数转义场景

解决方案

方案1:修正数据库连接参数(优先推荐)

多数情况下该报错是因为连接数据库时未指定正确的字符集参数,导致驱动转义逻辑异常,修改连接配置即可,参数化查询本身会自动处理特殊字符转义,不需要额外做序列化处理:

from mysql import connector as sqlserver

Database = sqlserver.connect(
    host=host, 
    user=user, 
    passwd=passwd, 
    db=db,
    # 新增以下两个配置项
    charset='utf8mb4',
    use_unicode=True
)
Database.autocommit = True
Cursor = Database.cursor()

# 注意Table是MySQL保留关键字,需要用反引号包裹
Cursor.execute('INSERT INTO `Table` (A, B) VALUES (%s, %s)',
               ('This_is_a_test', '\n\nThis is a test\n\n'))

插入后数据库中会直接保留原始的换行格式。

方案2:手动转义特殊字符

如果调整连接参数后仍然报错,可以用MySQL驱动自带的转义方法处理字符串,不要用json.dumps:

from mysql import connector as sqlserver
from mysql.connector import escape_string

Database = sqlserver.connect(
    host=host, 
    user=user, 
    passwd=passwd, 
    db=db,
    charset='utf8mb4',
    use_unicode=True
)
Database.autocommit = True
Cursor = Database.cursor()

raw_b = '\n\nThis is a test\n\n'
# 仅转义特殊控制字符,不会添加额外引号
escaped_b = escape_string(raw_b)

Cursor.execute('INSERT INTO `Table` (A, B) VALUES (%s, %s)',
               ('This_is_a_test', escaped_b))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 11:15:03