搜索资料,发现大部分资料关于这个错误的解决方案是这么写的:
这是我们开启了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将放弃对自定义功能具有确定性或不修改数据的要求。
所以正确做法并不是要求MySQL放弃检查,而是在创建自定义功能时指定确定性。查看MySQL文档,可以看到官方设置的创建Function格式如下:
CREATE [DEFINER = user] FUNCTION sp_name ([func_parameter[,...]]) RETURNS type [characteristic ...] routine_bodyso,正确姿势是在返回类型后面指定定确定性:
create function myfunc() returns int NO SQL return 100;看到这里,希望以后的你创建Function一定要长点心哟。