我有以下函数,它在我的服务器上的多个数据库中使用。
CREATE FUNCTION `fn_strings_intersect`(arg_str1 VARCHAR(255), arg_str2 VARCHAR(255)) RETURNS varchar(255) CHARSET latin1
BEGIN
SET arg_str1 = CONCAT(arg_str1, ",");
SET @var_result = "";
WHILE(INSTR(arg_str1, ",") > 0)
DO
SET @var_val = SUBSTRING_INDEX(arg_str1, ",", 1);
SET arg_str1 = SUBSTRING(arg_str1, INSTR(arg_str1, ",") + 1);
IF(FIND_IN_SET(replace(@var_val, ' ', ''), arg_str2) > 0)
THEN
SET @var_result = CONCAT(@var_result, @var_val, ",");
END IF;
END WHILE;
IF (@var_result = "")
THEN
RETURN false;
ELSE
RETURN true;
END IF;
END;
该功能会定期并以不可预测的方式在所有数据库中丢失。
该函数或我的 MySQL 配置是否存在问题,可能导致该函数被丢弃?
答案1
您是否在守护进程启动时使用了--skip-grant-tables?
来自 CREATE FUNCTION 的文档
活动函数是指已使用 CREATE FUNCTION 加载且未使用 DROP FUNCTION 删除的函数。每次服务器启动时,所有活动函数都会重新加载,除非你使用 --skip-grant-tables 选项启动 mysqld。
答案2
乍一看,该函数似乎无害,但我确实想知道如果它在执行过程中引发异常会发生什么。我对 MySQL 了解不够多,无法预测它会做什么 - 我只知道它可能会删除或禁用该函数。
发生这种情况时的随机部分可能是一些您无法预见的导致异常的奇怪且罕见的参数。
你可以测试一个同名的空函数。如果这个函数没有显示问题,这可能表明存在运行时问题。
第二个测试是向函数添加错误处理程序,看看问题是否会消失。