SQL语法看似正确却报错,请求排查MySQL多语句执行问题
问题排查与解决
核心原因分析
报错指向第二条UPDATE语句开头,大概率是执行环境不支持一次性执行多条SQL语句,同时JSON字符串的转义方式也存在错误。
具体解决步骤
1. 拆分语句单独执行
将三条SQL语句分开,每次仅执行一条,同时修正JSON字符串的转义问题:
- 第一条更新语句:
UPDATE accounts SET lastSerialChange = CURRENT_TIMESTAMP WHERE username = 'Jayden';
- 第二条更新语句(把HTML转义的
"替换为实际双引号"):
UPDATE accounts SET serialChanges = '[{"serial":"D06ACE5BBE90E803590D1691FB9254B3","reason":"test","date":1695495618004}]' WHERE username = 'Jayden';
- 第三条插入语句:
INSERT INTO serial_requests (username, serial, reason, requestedAt) VALUES ('Jayden', 'D06ACE5BBE90E803590D1691FB9254B3', 'test', 1695495618004);
2. 若需批量执行,开启多语句支持
如果必须一次性执行多条语句:
- 命令行客户端:MySQL命令行默认支持多语句,确保每条语句用分号
;正确分隔后直接粘贴执行即可。 - 编程语言驱动:若使用JDBC、pymysql等驱动,需手动开启多语句执行配置:
- JDBC:在连接URL后追加
allowMultiQueries=true - pymysql:连接时设置
client_flag=pymysql.constants.CLIENT.MULTI_STATEMENTS
注意:开启该配置会提升SQL注入风险,需严格做好参数校验。
- JDBC:在连接URL后追加
3. 优化JSON字段的写入方式(针对MySQL 5.7+)
如果serialChanges是JSON类型字段,推荐用MySQL内置JSON函数构造数据,避免手动转义引号的错误:
UPDATE accounts SET serialChanges = JSON_ARRAY( JSON_OBJECT( 'serial', 'D06ACE5BBE90E803590D1691FB9254B3', 'reason', 'test', 'date', 1695495618004 ) ) WHERE username = 'Jayden';
内容的提问来源于stack exchange,提问作者Jaydendev
相关产品推荐
相关产品推荐

