MySQL创建自定义函数时报错(MySQL版本:8.0.13);
错误信息: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)
mysql> SET GLOBAL log_bin_trust_function_creators = 1;
Query OK, 0 rows affected (0.01 sec)
官方文档:
http://dev.mysql.com/doc/refman/5.0/en/stored-programs-logging.html
原因:
当您尝试执行存储函数时,如果 binlog_format=STATEMENT
已设置,则DETERMINISTIC
必须在函数定义中指定关键字。如果不是这种情况,则会生成错误并且函数不会运行,除非 log_bin_trust_function_creators=1
指定覆盖此检查(参见下文)。对于递归函数调用,DETERMINISTIC
仅在最外层调用时需要该关键字。如果正在使用基于行或混合二进制日志记录,则即使在没有DETERMINISTIC
关键字的情况下定义函数,也会接受并复制该语句 。
因为MySQL在创建时不检查函数是否确实是确定性的,所以使用DETERMINISTIC
关键字调用存储函数可能会执行对基于语句的日志记录不安全的操作,或者调用包含不安全语句的函数或过程。如果在binlog_format=STATEMENT
设置时发生这种情况 ,则会发出警告消息。如果正在使用基于行或混合二进制日志记录,则不会发出警告,并且将以基于行的格式复制语句。
要放松函数创建的前述条件(必须具有SUPER
权限并且必须将函数声明为确定性或不修改数据),请将全局log_bin_trust_function_creators
系统变量设置 为1.默认情况下,此变量的值为0,但是你可以改变它:
mysql> SET GLOBAL log_bin_trust_function_creators = 1;