MySQL 出现错误1418 的原因分析及解决方法

yizhihongxing

MySQL 出现错误1418 的原因分析及解决方法

错误描述

在使用 MySQL 进行数据操作时,有可能会出现以下错误提示:

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中的一个常见错误,它的主要问题在于MySQL的二进制日志系统和函数的使用有冲突,导致该错误的出现。本文将详细讲解MySQL错误1418的原因分析及解决方法。

原因分析

该错误通常出现在创建自定义函数时,如果函数使用包含非DETERMINISTIC, NO SQL 或 READS SQL DATA 的操作,则会触发该错误。当MySQL的二进制日志系统启用并且函数使用了带有这些选项的操作时,该错误会出现。

以下是MySQL官方文档对于这些选项的定义:

  • DETERMINISTIC 表示函数的返回结果只依赖于其输入参数,而不依赖于任何其他因素。例如,sqrt()函数依赖于传递给它的参数,因此是确定性的;而now()函数不是,因为它的返回结果依赖于当前的时间。

  • NO SQL 表示函数不会与数据库中的任何数据进行交互,因此不需要读取或修改数据表。例如,像pi()这样的函数常常使用此选项。

  • READS SQL DATA 表示函数在运行期间会读取数据表。例如,像avg()这样的函数必须从数据表中读取数据才能计算平均值。

解决方法

解决方法是为函数添加 DEFINER 和 SQL SECURITY 子句,在函数定义中明确指明它们不具有确定性,或者必须访问数据表,也就是不带 DETERMINISTIC 或 READS SQL DATA 子句是不会出现1418错误的。

首先,可以使用以下命令查询MySQL服务器的当前状态:

SHOW VARIABLES LIKE 'log_bin_trust_function_creators';

如果将其设置为 ON,则可以绕过 MySQL 日志系统中的该错误,如果需要修改该变量,则可以使用以下命令:

SET GLOBAL log_bin_trust_function_creators = 1;

但是这种方法并不推荐使用,因为它会降低 MySQL 的安全性。

推荐的方法是在 MySQL 客户端中执行以下操作:

  1. 确保当前的 MySQL 用户具有创建函数的权限。

  2. 在定义函数时使用以下语句:

CREATE FUNCTION <function_name>([func_params]) RETURNS <return_type> [DETERMINISTIC, NO SQL, READS SQL DATA] SQL SECURITY INVOKER
BEGIN
    [function_body]
END

这里需要注意的是,DETERMINISTIC, NO SQL, READS SQL DATA 子句应根据函数的实际情况进行选择,而不应该随意添加。

示例

以下是两个示例,分别为使用带有 DETERMINISTIC 子句的 CREATE FUNCTION 命令创建函数和使用不带 DETERMINISTIC 子句的命令创建函数:

示例一

CREATE FUNCTION `add_numbers`(a INT, b INT) RETURNS INT DETERMINISTIC
BEGIN
  DECLARE sum INT;
  SET sum = a + b;
  RETURN sum;
END;

该示例中,DETERMINISTIC 子句被用于表明该函数的结果是确定性的。

示例二

CREATE FUNCTION `get_customer_count`() RETURNS INT
BEGIN
  DECLARE count INT;
  SELECT COUNT(*) INTO count FROM customers;
  RETURN count;
END;

该示例中,未使用 DETERMINISTIC 或 NO SQL 或 READS SQL DATA 子句,因为该函数需要访问名为 customers 的数据表。

结论

在MySQL数据操作时,当出现错误1418时,很可能是创建自定义函数所导致的,通过添加 DEFIENER 和 SQL SECURITY 子句,可以解决该问题,从根本上保证MySQL服务器的安全性和正常运行。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:MySQL 出现错误1418 的原因分析及解决方法 - Python技术站

(0)
上一篇 2023年5月18日
下一篇 2023年5月18日

相关文章

  • 一文带你了解MySQL四大类日志

    一下是“一文带你了解MySQL四大类日志”的完整攻略: 一文带你了解MySQL四大类日志 MySQL作为目前最流行的开源关系型数据库之一,拥有着丰富的特性和强大的功能。在它的运行过程中,MySQL会产生各种类型的日志,用于记录MySQL的运行状况和异常情况。MySQL日志主要可分为四大类:二进制日志、错误日志、查询日志和慢查询日志。 二进制日志 二进制日志(…

    MySQL 2023年5月18日
    00
  • Mysql/MariaDB启动时处于进度条状态导致启动失败的原因及解决办法

    Mysql/MariaDB启动时,经常会发生进度条卡顿或进度条停滞的情况,导致启动失败。造成这种情况的原因有很多,但是最常见的原因是数据库在启动时需要执行一些复杂的恢复操作或者清理操作,这些操作可能需要很长时间才能完成。下面是一些原因及其解决方法: 原因一:数据库日志文件过大 如果你的数据库日志文件过大,并且在你之前的一次关闭时没有被删除或清除,那么在启动时…

    MySQL 2023年5月18日
    00
  • Mysql数据库的QPS和TPS的意义和计算方法

    MySQL数据库的QPS和TPS是数据库性能评估的两个重要指标,QPS代表每秒查询率,而TPS代表每秒事务处理率。 QPS的计算公式为:Query数/时间,例如,如果在1秒钟内执行了1000次查询,则QPS为1000。QPS可以用来评估系统的查询性能。 TPS的计算方法有三种,分别是Commit、Rollback以及Insert+Update+Delete。…

    MySQL 2023年5月19日
    00
  • 详解MySQL AS:设置别名

    MySQL AS是用于给SQL查询结果列、表和子查询设置别名的关键字。AS不是必需的,但它使得查询结果更易于阅读和理解。 AS用法示例: 列别名 在SELECT语句中,使用AS关键字为查询结果列设置别名。例如: SELECT first_name AS given_name, last_name AS family_name FROM customers; …

    MySQL 2023年3月9日
    00
  • MySQL中的异常处理

      与java中的异常一样,都是用来定义在处理过程中遇到的问题以及相应的处理方式。 2,自定义异常及处理方式   1,自定义异常语句     DECLARE condition_name CONDITION FOR condition_value;     condition_name:是自己起的名字,最好见名知意。     condition_value:…

    MySQL 2023年4月13日
    00
  • GaussDB(DWS)网络流控与管控效果

    摘要:本文主要介绍GaussDB(DWS)网络流控能力,并对其管控效果进行验证。 本文分享自华为云社区《GaussDB(DWS)网络流控与管控效果》,作者:门前一棵葡萄树。 上一篇博文GaussDB(DWS)网络调度与隔离管控能力,我们详细介绍了GaussDB网络调度逻辑,并简单介绍了如何应用网络隔离管控能力。本篇博文主要介绍GaussDB(DWS)网络流控…

    MySQL 2023年5月5日
    00
  • MySQL修改用户(RENAME USER)

    MySQL是一款用于处理关系型数据库的开源软件。在MySQL中,我们通过“用户”来限制对于数据库的访问权限。在实际的工作中,由于各种原因,我们可能需要修改MySQL用户的账号名或密码等信息。本文将介绍如何在MySQL中修改用户的方法。 RENAME USER语法 MySQL提供了RENAME USER语句来修改用户的账号名。语句的一般语法如下: RENAME…

    MySQL 2023年3月10日
    00
  • 发现Mysql的主从数据库没有同步,差点凉凉了

    摘要:今天发现Mysql的主从数据库没有同步,瞬间整个人头皮发麻。 本文分享自华为云社区《糟了,生产环境数据竟然不一致,人麻了!》,作者:冰 河 。 今天发现Mysql的主从数据库没有同步 先上Master库: mysql>show processlist; 查看下进程是否Sleep太多。发现很正常。 show master status; 也正常。 …

    MySQL 2023年4月17日
    00
合作推广
合作推广
分享本页
返回顶部