在mysql中导入数据库时​​,出现以下错误:
1418 (HY000) at line 10185: 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;
  • 将以下内容添加到mysql.ini配置文件中:
    log_bin_trust_function_creators = 1;

  • 该设置放松了对不确定功能的检查。非确定性函数是修改数据的函数(即具有更新,插入或删除语句的函数)。有关更多信息,请参见here

    请注意,如果未启用二进制日志记录,则此设置不适用。

    Binary Logging of Stored Programs



    log_bin_trust_function_creators



    最好的方法是更好地理解和使用存储函数的确定性声明。 MySQL使用这些声明来优化复制,因此,仔细选择它们以确保复制正常是一件好事。

    DETERMINISTIC
    如果例程对于相同的输入参数总是产生相同的结果,则例程被认为是“确定性的”,否则就不能确定。
    这主要用于字符串或数学处理,但不仅限于此。

    不确定
    与“DETERMINISTIC”相反。
    “如果例程定义中未给出DETERMINISTIC或NOT DETERMINISTIC,则默认值为NOT DETERMINISTIC。要声明函数是确定性的,必须显式指定DETERMINISTIC。”
    因此,似乎没有作出任何声明,MySQl会将函数视为“NOD DETERMINISTIC”。
    手册中的这一陈述与手册另一 Realm 的其他陈述相抵触:
    创建存储函数时,必须声明它是确定性的或不修改数据。否则,对于数据恢复或复制可能不安全。
    默认情况下,要接受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语句。

    CONTAINS SQL
    这表明该例程包含SQL指令,但不包含读取或写入数据的语句。如果未明确给出这些特征,则为默认设置。此类语句的示例为SELECT NOW(),SELECT 10 + @ b,SET @x = 1或DO RELEASE_LOCK('abc'),它们执行但既不读取也不写入数据。

    请注意,有些MySQL函数不是确定性安全的,例如:NOW(),UUID()等,它们可能在不同的机器上产生不同的结果,因此包含此类指令的用户函数必须声明为NOT DETERMINISTIC 。
    同样,从未复制的架构中读取数据的函数显然是NONDETERMINISTIC。
    *

    10-05 19:43