MySQL 8带参自定义函数返回值异常:多次调用值不变
带参自定义函数返回值不变,无参函数正常变化的原因分析
这个问题的核心是MySQL 8.0对自定义函数的确定性(DETERMINISTIC)属性的自动判定逻辑导致的。
原因拆解
- MySQL会根据函数的参数情况、内部调用的函数类型自动推断确定性:
- 无参函数:如果内部调用了
UNIX_TIMESTAMP()这类返回值随时间变化的非确定性函数,MySQL会默认标记它为NOT DETERMINISTIC,每次执行都会重新计算结果,所以返回值会随时间更新。 - 带参函数:哪怕内部用了非确定性函数,MySQL默认会因为函数存在参数,优先判定它为
DETERMINISTIC(确定性函数)。这类函数的返回值会被MySQL缓存,只要传入的参数不变,就直接返回缓存结果,不会重新执行函数内的逻辑,自然UNIX_TIMESTAMP()的新值不会被计算进去。
- 无参函数:如果内部调用了
验证方式
可以查询information_schema.routines表确认函数的确定性属性:
SELECT ROUTINE_NAME, IS_DETERMINISTIC FROM information_schema.routines WHERE ROUTINE_SCHEMA = '你的数据库名称' AND ROUTINE_NAME IN ('test_function_with_param', 'test_function_without_param');
执行后会看到test_function_with_param的IS_DETERMINISTIC值是YES,无参函数则为NO。
解决办法
创建带参函数时,显式指定NOT DETERMINISTIC属性,告诉MySQL这个函数是非确定性的,不能缓存结果:
CREATE FUNCTION test_function_with_param(p1 VARCHAR(10), p2 VARCHAR(20)) RETURNS VARCHAR(100) NOT DETERMINISTIC -- 显式标记非确定性 BEGIN -- 你的函数逻辑示例:拼接参数与UNIX_TIMESTAMP()的十六进制值 RETURN CONCAT(p1, p2, HEX(UNIX_TIMESTAMP())); END;
如果函数已经存在,用ALTER FUNCTION修改:
ALTER FUNCTION test_function_with_param(p1 VARCHAR(10), p2 VARCHAR(20)) NOT DETERMINISTIC;
内容的提问来源于stack exchange,提问作者wienzzz
相关产品推荐
相关产品推荐

