解决MySQL创建UDF报错ERROR 1418的正确姿势

    技术2023-12-15  64

    MySQL创建UDF ERROR 1418

    ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)

    搜索资料,发现大部分资料关于这个错误的解决方案是这么写的:

    这是我们开启了bin-log, 我们就必须指定我们的函数是否是 1 DETERMINISTIC 不确定的 2 NO SQL 没有SQl语句,当然也不会修改数据 3 READS SQL DATA 只是读取数据,当然也不会修改数据 4 MODIFIES SQL DATA 要修改数据 5 CONTAINS SQL 包含了SQL语句 其中在function里面,只有 DETERMINISTIC, NO SQL 和 READS SQL DATA 被支持。如果我们开启了 bin-log, 我们就必须为我们的function指定一个参数。 在MySQL中创建函数时出现这种错误的解决方法: set global log_bin_trust_function_creators=TRUE;

    官方描述

    可是为什么? 打开MySQL文档,可以看到其中有如下描述:链接在此 首先,MySQL的binlog功能记录的方式是通过记录调用而不是具体执行的语句。 如果自定义函数更新数据的的行为不确定,则该功能不可重复。这可能会产生两个不良影响:

    主节点和从节点的数据将出现差异恢复的数据将不同于原始数据

    为什么要求确定性呢?

    所以总结如下: MySQL对于自定义函数的复制和恢复本质上是对此函数对重复调用。如果自定义函数的行为具有不确定性,即两次相同入参产生的结果不一致,那么将无法保证数据同步和数据恢复的准确性。 因此MySQL默认强制要求创建的函数必须声明具有确定性或者不修改数据,否则就会出现此文开头的报错。 而修改参数log_bin_trust_function_creators的实际意义顾名思义,MySQL将放弃对自定义功能具有确定性或不修改数据的要求。

    创建Function的正确姿势

    所以正确做法并不是要求MySQL放弃检查,而是在创建自定义功能时指定确定性。查看MySQL文档,可以看到官方设置的创建Function格式如下:

    CREATE [DEFINER = user] FUNCTION sp_name ([func_parameter[,...]]) RETURNS type [characteristic ...] routine_body

    so,正确姿势是在返回类型后面指定定确定性:

    create function myfunc() returns int NO SQL return 100;

    碎碎念

    看到这里,希望以后的你创建Function一定要长点心哟。

    Processed: 0.010, SQL: 9