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

