今天启用了MySQL二进制日志,而后再使用MySQL建立函数,运行语句进行建立时老是报以下错误:数据库
[Err] 1418 - 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的二进制日志形成的,通过屡次尝试发现了三种解决方案。less
方案一函数
在建立函数的同时为函数指定一个参数,明确指出函数的类型。由于数据库启用bin-log后,在进行主从复制必需要知道这个函数的类型才能同步数据,所以在声明函数时咱们必须指定咱们的函数的类型,MySQL支持的参数类型有如下五种:spa
1. DETERMINISTIC 不肯定的日志
2. NO SQL 没有SQl语句,固然也不会修改数据blog
3. READS SQL DATA 只是读取数据,固然也不会修改数据同步
4. MODIFIES SQL DATA 要修改数据it
5. CONTAINS SQL 包含了SQL语句io
方案二
将log_bin_trust_function_creators 设置为1,启动MySQL运行下面命令:
set GLOBAL log_bin_trust_function_creators=1;
由于二进制日志的一个重要功能是用于主从复制,而存储函数有可能致使主从的数据不一致。因此当开启二进制日志后,参数log_bin_trust_function_creators就会生效,限制存储函数的建立、修改、调用。所以,设置这个参数就至关于明确告知MySQL服务器这个函数不会修改数据,这样就能顺利进行函数的建立。
默认 log_bin_trust_function_creators=0,处于关闭状态
设置 log_bin_trust_function_creators=1,处于开启状态
设置好以后就能够直接建立函数了