MySQL存储过程出现1064语法错误,求排查解决(附完整代码)
排查MySQL存储过程1064语法错误的解决方案
问题根源及修复点:
- 字符集参数无效:
VARCHAR(25) CHARACTER SET utf里的utf不是MySQL支持的合法字符集,需替换为utf8或utf8mb4。 - 动态SQL格式错误:concat语句中混入的
<code>标签会被解析成SQL的一部分,导致表名引用失效,要改用MySQL的反引号`来包裹标识符。 - 缺失分隔符修改:创建存储过程时未提前修改语句分隔符,MySQL会默认把
;当作语句结束符,直接截断存储过程定义,必须先执行DELIMITER $$。 - 日期计算逻辑优化:原表达式
(CURRENT_DATE - 7)- INTERVAL ... DAY可简化为CURRENT_DATE - INTERVAL (logs_data_retention_db + 7) DAY,避免运算优先级引发的逻辑问题。
修复后的完整代码:
DELIMITER $$ CREATE PROCEDURE `logs_user_aht_delete`( IN logs_database VARCHAR(25) CHARACTER SET utf8mb4, IN logs_data_retention_db INT(10) ) BEGIN SET @v = CONCAT( 'DELETE FROM `', logs_database, '`.`user_aht` ua WHERE IFNULL(ua.completed_at, ua.inserted_at) < CURRENT_DATE - INTERVAL ', logs_data_retention_db + 7, ' DAY;' ); PREPARE stm FROM @v; EXECUTE stm; DEALLOCATE PREPARE stm; END$$ DELIMITER ;
额外说明:
- 若你的MySQL版本低于5.5.3,可将
utf8mb4替换为utf8,但utf8mb4支持更完整的Unicode字符,推荐优先使用。 - 执行存储过程前,需确保调用者拥有目标数据库的
DELETE权限,以及存储过程的EXECUTE权限。
内容的提问来源于stack exchange,提问作者Stella
相关产品推荐
相关产品推荐

