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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 21:39:19