使用PyMySQL插入Unicode值时出现SQL语法错误的问题求助
这问题我熟!你遇到的语法错误根本原因是直接拼接Unicode字符串到SQL语句里,手动拼接很容易因为字符串里的特殊字符(比如单引号、换行)破坏SQL结构,而且完全没必要手动转utf8——用PyMySQL的参数化查询就能完美解决。
先看你的报错信息:near ''Chapter 4', u'Objective:\r\n\r\n* Exit any mininet launch done earlier using \u',这说明你大概率是用了字符串格式化(比如format()或者f-string)把Unicode值直接硬插进SQL里,这种写法会让内容里的单引号提前闭合SQL的字符串,导致语法彻底混乱。
正确解决方案:用参数化查询
永远不要手动拼接SQL参数,让PyMySQL驱动帮你处理转义、编码所有细节:
1. 确保数据库连接字符集配置正确
连接数据库时指定charset='utf8mb4'(它比普通utf8支持更完整的Unicode字符,包括emoji这类特殊符号):
import pymysql conn = pymysql.connect( host="你的主机地址", user="你的用户名", password="你的密码", database="目标数据库名", charset="utf8mb4" )
2. 用参数化方式执行INSERT语句
用%s作为SQL里的参数占位符(注意这不是Python的格式化符号,是PyMySQL对应MySQL的参数标记),然后把要插入的Unicode值以元组形式传给execute()方法:
try: with conn.cursor() as cursor: # 写SQL时用%s代替具体的变量值 sql = "INSERT INTO 你的表名 (章节列名, 内容列名) VALUES (%s, %s)" # 直接传入Unicode字符串,不需要手动编码 cursor.execute(sql, ("Chapter 4", "Objective:\r\n\r\n* Exit any mininet launch done earlier using …")) # 提交事务 conn.commit() finally: conn.close()
为什么这方法有效?
- PyMySQL会自动处理所有特殊字符的转义(比如单引号、换行符),不会破坏SQL语法结构
- 原生支持Unicode字符串,完全不需要手动转成utf8字节
- 还能避免SQL注入攻击,安全性拉满
另外补充一点:要确保你的数据库表和对应的字段,字符集也设置为utf8mb4,这样才能完整存储所有Unicode内容。
内容的提问来源于stack exchange,提问作者user2664107
相关产品推荐
相关产品推荐

