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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值