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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:53:36