有两种方法可以解决这个问题:
-
在 MySQL 控制台中执行以下命令:
SET GLOBAL log_bin_trust_function_creators = 1;
-
将以下内容添加到 mysql.ini 配置文件中:
log_bin_trust_function_creators = 1;
该设置放宽了对非确定性函数的检查。非确定性函数是修改数据的函数(即具有更新、插入或删除语句)。如需更多信息,请参阅here。
请注意,如果未启用二进制日志记录,则此设置不适用。
Binary Logging of Stored Programs
如果未启用二进制日志记录,则 log_bin_trust_function_creators 会启用
不适用。
log_bin_trust_function_creators
此变量在启用二进制日志记录时适用。
最好的方法是更好地理解和使用存储函数的确定性声明。 MySQL 使用这些声明来优化复制,仔细选择它们以获得健康的复制是一件好事。
确定性
如果例程总是为相同的输入参数产生相同的结果,则认为例程是“确定性的”,否则为 NOT DETERMINISTIC。
这主要用于字符串或数学处理,但不限于此。
不确定
与“确定性”相反。
“如果例程定义中既没有给出 DETERMINISTIC 也没有给出 NOT DETERMINISTIC,则默认为 NOT DETERMINISTIC。要声明函数是确定性的,您必须明确指定 DETERMINISTIC。”。
所以似乎如果没有声明,MySQl 会将函数视为“NOT DETERMINISTIC”。
手册中的这一陈述与手册另一个领域的其他陈述相矛盾,该陈述表明:
" 当你创建一个存储函数时,你必须声明它是确定性的,或者它不会修改数据。否则,它可能对数据恢复或复制不安全。
默认情况下,要接受 CREATE FUNCTION 语句,必须显式指定 DETERMINISTIC、NO SQL 或 READS SQL DATA 中的至少一个。否则会出错"
如果没有声明,我个人在 MySQL 5.5 中会出错,所以我总是至少声明一个“DETERMINISTIC”、“NOT DETERMINISTIC”、“NO SQL”或“READS SQL DATA”,不管我可能有其他声明.
读取 SQL 数据
这明确告诉 MySQL 该函数将只从数据库中读取数据,因此,它不包含修改数据的指令,但它包含读取数据的 SQL 指令(例如 SELECT)。
修改 SQL 数据
这表明例程包含可能写入数据的语句(例如,它包含 UPDATE、INSERT、DELETE 或 ALTER 指令)。
无 SQL
这表明该例程不包含 SQL 语句。
包含 SQL
这表明例程包含 SQL 指令,但不包含读取或写入数据的语句。如果没有明确给出这些特征,则这是默认设置。此类语句的示例是 SELECT NOW()、SELECT 10+@b、SET @x = 1 或 DO RELEASE_LOCK('abc'),它们执行但既不读取也不写入数据。
注意有一些MySQL函数不是确定性安全的,比如:NOW()、UUID()等,在不同的机器上很可能会产生不同的结果,所以必须声明一个包含此类指令的用户函数作为不确定的。
此外,从非复制模式中读取数据的函数显然是非确定性的。
*
对例行程序性质的评估是基于“诚实”的
创建者:MySQL 不检查声明 DETERMINISTIC 的例程是否为
没有产生不确定结果的陈述。然而,
错误地声明例程可能会影响结果或影响性能。
将不确定的例程声明为 DETERMINISTIC 可能会导致
导致优化器不正确的意外结果
执行计划选择。将确定性例程声明为
NONDETERMINISTIC 可能会通过导致可用
不使用优化。