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一定要长点心哟。