向MySQL插入数据因单引号引发语法错误,求可行插入方案
解决MySQL插入含单引号数据的语法错误
问题场景
执行以下SQL插入语句时触发语法错误:
INSERT INTO birthday(team, birthday) VALUES ('Norway', {"2020-01-01": "Ram's BDay"}));
报错信息:
ProgrammingError: (1064, 'You have an error in your SQL syntax; check the manual that corresponds to your MySQL server ver
已确认错误由Ram's BDay中的单引号导致,且无法控制数据流中的单引号,如何实现正常插入?
解决方案
1. 使用参数化查询(推荐)
这是最安全、规范的做法,既能避免SQL注入,又能自动处理单引号等特殊字符。以Python的mysql-connector驱动为例:
import mysql.connector # 建立数据库连接 db = mysql.connector.connect(host="your_host", user="your_user", password="your_pwd", database="your_db") cursor = db.cursor() # 定义带占位符的SQL语句 sql = "INSERT INTO birthday(team, birthday) VALUES (%s, %s)" # 准备插入数据,无需手动转义 data = ('Norway', '{"2020-01-01": "Ram\'s BDay"}') # 执行并提交 cursor.execute(sql, data) db.commit() # 关闭连接 cursor.close() db.close()
参数化查询会由数据库驱动自动处理字符串中的特殊字符,完全规避语法错误和注入风险。
2. 手动转义单引号(仅应急使用)
如果必须拼接SQL字符串(不推荐,存在SQL注入风险),可以按照MySQL的规则,将单引号替换为两个连续单引号:
original_data = '{"2020-01-01": "Ram\'s BDay"}' # 转义单引号 escaped_data = original_data.replace("'", "''") # 拼接SQL语句 sql = f"INSERT INTO birthday(team, birthday) VALUES ('Norway', '{escaped_data}');"
这种方法仅适用于临时场景,无法应对所有特殊字符,且存在安全隐患。
3. 确认字段类型适配
如果birthday字段定义为JSON类型,确保插入的是合法JSON格式的字符串。参数化查询依然适用,部分驱动支持直接传入Python字典并自动转换为JSON格式存储。
内容的提问来源于stack exchange,提问作者user13744439
相关产品推荐
相关产品推荐

