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

MySQL函数创建失败(错误码1064)排查:Liquibase执行SQL脚本遇语法错误

问题根源与解决办法

我帮你排查过了,这个问题根本不是你的SQL语法有问题,而是Liquibase默认的语句拆分逻辑导致的!

Liquibase默认把分号(;)当作SQL语句的结束标记,但你的MySQL函数体里有多个分号(比如变量声明、赋值语句的结尾),这会让Liquibase错误地把函数定义拆成了多个片段,提前终止了函数的创建过程——从错误日志里能看到,它只执行到END IF就停了,后面的END;直接被截断,自然就报语法错误了。

下面给你两种靠谱的解决方法:

方法一:直接禁用语句拆分

修改你的Liquibase变更集,给<sqlFile>加上splitStatements="false"属性,告诉Liquibase把整个SQL文件里的内容当作一条完整的语句执行,不要拆分:

<changeSet author="user" id="1712203200334-1">
    <sqlFile path="config/liquibase/IsValidCoordinatesFormat.sql" splitStatements="false"/>
</changeSet>

这种方法最简单,适合单个函数定义的SQL文件。

方法二:自定义结束符

如果你的SQL文件里还有其他独立的SQL语句,需要保留拆分功能,可以自定义一个Liquibase不会误判的结束符,比如//:

  1. 先修改你的SQL脚本,在函数的END;后面加上//,函数内部的分号保持不变:
CREATE FUNCTION IsValidCoordinatesFormat(coordString VARCHAR(255)) 
RETURNS BOOLEAN DETERMINISTIC 
BEGIN 
    DECLARE isValid BOOLEAN; 
    DECLARE regex VARCHAR(255); 
    SET isValid = FALSE; 
    SET regex = '^(-?\\d+(\\.\\d+)?);(-?\\d+(\\.\\d+)?)$'; 
    IF coordString REGEXP regex THEN 
        SET isValid = TRUE; 
    END IF; 
    RETURN isValid; 
END //
  1. 然后修改Liquibase变更集,指定endDelimiter="//",让Liquibase识别这个自定义的结束标记:
<changeSet author="user" id="1712203200334-1">
    <sqlFile path="config/liquibase/IsValidCoordinatesFormat.sql" endDelimiter="//"/>
</changeSet>

另外提一句,如果你用的是MySQL 8.0及以上版本,确保执行变更的数据库账号有CREATE ROUTINE权限,但从你的错误信息来看,权限应该没问题,主要还是语句拆分的锅~

内容的提问来源于stack exchange,提问作者Charfeddine Mohamed Ali

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 12:32:34