Mysql 已启用确定性、无SQL或读取其声明中的SQL数据以及二进制日志记录

Mysql 已启用确定性、无SQL或读取其声明中的SQL数据以及二进制日志记录,mysql,Mysql,在mysql中导入数据库时,出现如下错误: 1418(HY000)第10185行:此函数在其声明中没有确定性、无SQL或读取SQL数据,并且启用了二进制日志记录(您*可能*希望使用不太安全的日志\u bin\u trust\u函数\u creators变量) 我不知道我需要改变什么。有谁能帮我解决这个问题吗?有两种方法可以解决这个问题: 在MySQL控制台中执行以下操作: 设置全局日志\u bin\u信任函数\u creators=1 将以下内容添加到mysql.ini配置文件中: log\u

在mysql中导入数据库时,出现如下错误:

1418(HY000)第10185行:此函数在其声明中没有确定性、无SQL或读取SQL数据,并且启用了二进制日志记录(您*可能*希望使用不太安全的日志\u bin\u trust\u函数\u creators变量)


我不知道我需要改变什么。有谁能帮我解决这个问题吗?

有两种方法可以解决这个问题:

  • 在MySQL控制台中执行以下操作:

    设置全局日志\u bin\u信任函数\u creators=1

  • 将以下内容添加到mysql.ini配置文件中:

    log\u bin\u trust\u function\u creators=1

  • 该设置放松了对非确定性函数的检查。非确定性函数是修改数据的函数(即具有update、insert或delete语句)。有关详细信息,请参阅

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

    如果未启用二进制日志记录,则日志\u bin\u trust\u函数\u创建者会启用 不适用

    启用二进制日志记录时,此变量适用

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

    确定性的 如果一个例程总是对相同的输入参数产生相同的结果,而在其他情况下不具有确定性,则该例程被认为是“确定性的”。 这主要用于字符串或数学处理,但不限于此

    不确定性 与“确定性”相反。 “如果例程定义中既没有给出确定性也没有给出非确定性,则默认为非确定性。若要声明函数是确定性的,必须显式指定确定性。”。 因此,如果没有声明,MySQl会将函数视为“不确定”。 手册中的这一陈述与手册另一部分的其他陈述相矛盾,说明: 创建存储函数时,必须声明它是确定性的,或者它不修改数据。否则,它可能对数据恢复或复制不安全。 默认情况下,要接受CREATE FUNCTION语句,必须显式指定DETERMINISTIC、NO SQL或READS SQL数据中的至少一个。否则将发生错误“

    我个人在MySQL5.5中遇到了一个错误,如果没有声明,那么我总是至少声明一个“确定性”、“非确定性”、“无SQL”或“读取SQL数据”,而不考虑其他声明

    读取SQL数据 这明确地告诉MySQL,该函数将只从数据库中读取数据,因此,它不包含修改数据的指令,而是包含读取数据的SQL指令(e.q.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()等,它们可能在不同的机器上产生不同的结果,因此包含此类指令的用户函数必须声明为非确定性函数。 此外,从未复制模式读取数据的函数显然是不确定的。 *

    对日常工作性质的评估是基于员工的“诚实” creator:MySQL不检查声明的例程是否是确定性的 没有产生不确定结果的语句。然而, 错误声明例程可能会影响结果或性能。 将非确定性例程声明为确定性例程可能会导致 导致优化器做出不正确选择的意外结果 执行计划选择。将确定性例程声明为 不确定性可能会导致可用的 不使用优化

    • 创建存储函数时,必须声明它是 确定性或不修改数据。否则,它可能是 数据恢复或复制不安全

    • 默认情况下,对于要接受的CREATEFUNCTION语句,至少 必须指定确定性、无SQL或读取SQL数据中的一个 明确地否则会发生错误:

    要解决此问题,请在Return语句之后和Begin语句之前添加以下行:

    READS SQL DATA
    DETERMINISTIC
    
    例如:

    CREATE FUNCTION f2()
    RETURNS CHAR(36) CHARACTER SET utf8
    /*ADD HERE */
    READS SQL DATA
    DETERMINISTIC
    BEGIN
    

    有关此问题的更多详细信息,请阅读唐纳德的评论:

    启用二进制日志记录时,此变量适用

    我所要做的就是:

  • my.cnf中禁用的日志存储库(#日志存储库)
  • 重新启动mysql
  • 导入数据库
  • 启用日志存储库
  • 重新启动mysql
  • 这一步解决了进口问题

    (然后我将查看程序员的代码以提出改进建议)

    在Windows 10上

    我只是通过以下方法解决了这个问题

  • 转到my.ini并将这两行添加到[mysqld]

    skip-log-bin
    log_bin_trust_function_creators = 1
    
  • 重新启动MySQL服务


  • 当您的函数是确定性的时,您可以安全地将其声明为确定性的。 “确定性”关键字的位置如下所示


    尝试设置