MySQL 函数创建中的 Err 1418:原因解析与解决指南20241203

🚨 MySQL 函数创建中的 Err 1418:原因解析与解决指南

📖 引言

在使用 MySQL 创建函数时,许多开发者会偶然遇到如下报错:

[Err] 1418 - This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled.

这个错误通常会让人疑惑:为何需要声明这些特性? 什么情况下会触发? 该如何解决?

本文将详细解析这一错误背后的原理,解释特性声明的意义,并提供多种解决方案,帮助开发者轻松规避这一问题。

🎯 问题背景

🔑 什么是二进制日志?

二进制日志(binary logging)是 MySQL 的一个重要功能,它记录了所有更改数据库状态的操作(如 INSERT、UPDATE),以支持数据恢复和主从复制功能。

⚙️ 创建函数为何会报错?

当启用了二进制日志时,MySQL 需要确保函数的执行是可预测且安全的。为此,MySQL 要求每个函数声明以下特性之一:
1. DETERMINISTIC:函数是确定性的,即对于相同输入,函数始终返回相同的输出。
2. NO SQL:函数不包含任何 SQL 语句。
3. READS SQL DATA:函数只读取数据,不对数据进行修改。

如果未明确声明这些特性,MySQL 默认认为该函数可能是不安全的,因此会抛出错误 1418。

🔍 特性声明的意义

🛡️ 为什么需要声明?

启用二进制日志后,MySQL 使用函数的特性声明来确保以下两点:
1. 复制一致性:
• 如果函数是非确定性的(NON-DETERMINISTIC),如基于 RAND() 或 NOW() 的函数,主从复制可能会产生不同的结果。
2. 数据安全性:
• 如果函数修改了数据(如使用 UPDATE),它可能会影响二进制日志的完整性。

📋 三种特性解析

特性描述
DETERMINISTIC确定性函数,输入相同必定返回相同结果。适合纯计算函数,如字符串处理或数学运算。
NO SQL函数中不包含任何 SQL 语句,仅用于简单计算或格式化操作。
READS SQL DATA函数可以读取数据库中的数据,但不能对数据进行修改。

💡 解决方案

方法 1:显式声明函数特性(推荐)

最安全的做法是在函数创建时,根据函数逻辑明确声明其特性。

示例 1:确定性函数

DELIMITER //CREATE FUNCTION calculate_square(input INT)
RETURNS INT
DETERMINISTIC
NO SQL
BEGINRETURN input * input;
END;
//DELIMITER ;

示例 2:读取数据的函数

DELIMITER //CREATE FUNCTION get_user_count()
RETURNS INT
READS SQL DATA
BEGINDECLARE count INT;SELECT COUNT(*) INTO count FROM users;RETURN count;
END;
//DELIMITER ;

方法 2:调整 MySQL 配置(开发环境可用)

在开发环境下,如果函数逻辑复杂且特性声明难以确定,可以通过修改 MySQL 配置,临时关闭特性声明的限制。

1. 临时设置

使用以下命令设置 log_bin_trust_function_creators 为 1,该设置对当前会话有效:

SET GLOBAL log_bin_trust_function_creators = 1;

2. 永久设置

在 MySQL 配置文件(如 my.cnf 或 my.ini)中添加以下内容:

[mysqld]
log_bin_trust_function_creators = 1

重启 MySQL 服务以使配置生效:

sudo systemctl restart mysqld

🔄 常见问题与解答

❓ 问题 1:如何选择特性声明?

•	如果函数不使用 SQL 语句(如纯计算函数),选择 DETERMINISTIC 和 NO SQL。
•	如果函数仅读取数据,选择 READS SQL DATA。
•	如果函数可能返回不同结果(如使用 RAND()),避免声明 DETERMINISTIC。

❓ 问题 2:log_bin_trust_function_creators 是否安全?

•	在生产环境中,不建议长期启用 log_bin_trust_function_creators,因为它会允许创建潜在不安全的函数。
•	在开发环境中可临时启用以加快调试速度。

🛠️ 实践案例

以下是一个完整的函数创建流程,展示了从错误报错到成功创建的步骤。

1. 报错示例

DELIMITER //CREATE FUNCTION generate_random()
RETURNS DOUBLE
BEGINRETURN RAND();
END;
//-- 报错:[Err] 1418

2. 修复函数特性

DELIMITER //CREATE FUNCTION generate_random()
RETURNS DOUBLE
DETERMINISTIC
NO SQL
BEGINRETURN RAND();
END;
//-- 报错原因:RAND() 是非确定性的,不能声明为 DETERMINISTIC。

3. 正确创建

DELIMITER //CREATE FUNCTION generate_random()
RETURNS DOUBLE
READS SQL DATA
BEGINRETURN RAND();
END;
//-- 成功创建函数。

🔮 总结与建议

•	明确声明函数特性:在创建函数时,始终根据逻辑选择合适的特性声明,以确保函数的安全性和可移植性。
•	调整配置仅限开发环境:log_bin_trust_function_creators 是开发工具,不应在生产环境中长期启用。
•	定期审查函数逻辑:避免函数中使用非确定性或修改数据的语句,以提升代码质量。

通过掌握这些技巧,开发者可以更好地处理 MySQL 函数创建中的常见问题,为高效开发和稳定运行打下坚实基础! 🎉

让我们共同探索更多技术领域的奥秘! 🚀

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/483546.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Node.js 实战: 爬取百度新闻并序列化 - 完整教程

很多时候我们需要爬取一些公开的网页内容来做一些数据分析和统计。而多数时候,大家会用到python ,因为实现起来很方便。但是其实Node.js 用来爬取网络内容,也是非常强大的。 今天我向大家介绍一下我自己写的一个百度新闻的爬虫,可…

Flink四大基石之State(状态) 的使用详解

目录 一、有状态计算与无状态计算 (一)概念差异 (二)应用场景 二、有状态计算中的状态分类 (一)托管状态(Managed State)与原生状态(Raw State) 两者的…

底部导航栏新增功能按键

场景需求: 在底部导航栏添加power案件,单击息屏,长按 关机 如下实现图 借此需求,需要掌握技能: 底部导航栏如何实现新增、修改、删除底部导航栏流程对底部导航栏部分样式如何修改。 比如放不下、顺序排列、坑点如…

如何在 Firefox 中清除特定网站的浏览历史记录

以下,我将介绍如何清除特定网站的浏览历史记录。清除历史记录可以保护隐私,特别是在公共或共享设备上使用时,还能节省设备存储空间,避免浏览历史占用过多内存。 如何清除特定网站的浏览历史记录 在 Firefox 中,清除特…

SpringMVC(二)

Model 以Map方式进行存储,用于向作用域中存值。 注意:在Model中增加模型数据,若不指定key,则默认使用对象的类型作为key Controller //控制器类 public class IndexController {RequestMapping("/index3")public Strin…

ABE 中的隐藏属性:DIPPE(去中心化内积谓词加密)

1. 引言 相关论文有: Yan Michalevsky 和 Marc Joye 2018年论文 Decentralized policy-hiding ABE with receiver privacy,发表于23rd European Symposium on Research in Computer Security, ESORICS 2018。Amit Sahai 和 Brent Waters 2005年论文 Fu…

计算机网络——不同版本的 HTTP 协议

介绍 HTTP,即超文本传输协议(HyperText Transfer Protocol),是应用层的一个简单的请求-响应协议,它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。本文将介绍 HTTP 协议各个版本。 HTTP/1.0 HTTP/1…

Linux——基础命令(2) 文件内容操作

目录 ​编辑 文件内容操作 1.Vim (1)移动光标 (2)复制 (3)剪切 (4)删除 (5)粘贴 (6)替换,撤销,查找 (7&#xff…

嵌入式硬件实战提升篇(三)商用量产电源设计方案 三路电源输入设计 电源管理 多输入供电自动管理 DCDC降压

引言:本文你能实际的了解到实战量产产品中电源架构设计的要求和过程,并且从实际实践出发搞懂电源架构系统,你也可以模仿此架构抄板到你自己的项目,并结合硬件篇之前的项目以及理论形成正真的三路电源输入设计与开发板电源架构块供…

30分钟学会正则表达式

正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。 作用 匹配 查看一个字符串是否符合正则表达式的语法 搜索 正…

如何手搓一个智能激光逗猫棒

背景 最近家里的猫胖了,所以我就想做个逗猫棒。找了一圈市场上的智能逗猫棒,运行轨迹比较单一,互动性不足。 轨迹单一,活动范围有限 而我希望后续可以结合人工智能物联网,通过摄像头来捕捉猫的位置,让小…

【C语言】递归的内存占用过程

递归 递归是函数调用自身的一种编程技术。在C语言中,递归的实现会占用内存栈(Call Stack),每次递归调用都会在栈上分配一个新的 “栈帧(Stack Frame)”,用于存储本次调用的函数局部变量、返回地…

Bert+CRF的NER实战

CRF(条件随机场-Conditional Random Field) 原始本文:我在北京吃炸酱面 标注示例(采用BIO标注方式): 我O在O北B-PLA京I-PLA吃O炸B-FOOD酱I-FOOD面I-FOOD CRF: 目的:提出一些不可能…

pycharm链接neo4j数据库(简单)

1.安装pycharm 2.安装库 pip install py2neo -i https://pypi.tuna.tsinghua.edu.cn/simple 3.代码试运行 from py2neo import Graph, Node, Relationship# 连接到Neo4j数据库,使用Bolt协议 graph Graph("bolt://localhost:7687", auth("neo…

故障诊断 | Transformer-LSTM组合模型的故障诊断(Matlab)

效果一览 文章概述 故障诊断 | Transformer-LSTM组合模型的故障诊断(Matlab) 源码设计 %% 初始化 clear close all clc disp(此程序务必用2023b及其以上版本的MATLAB!否则会报错!) warning off %

flask的第一个应用

本文编写一个简单的实例来记录下flask的使用 文章目录 简单实例flask中的路由无参形式有参形式 参数类型不同的http方法本文小结 简单实例 flask的依赖包都安装好之后,我们就可以写一个最简单的web应用程序了,我们把这个应用程序命名为first.py: from fl…

jmeter 压测常用静默参数解释应用

简介: JMeter静默压测(即无界面压测)是一种常用的性能测试方法,用于模拟多个用户同时访问系统并测量系统的响应时间和吞吐量等关键性能指标。在JMeter静默压测中,常用的压测参数及其解释如下: 一、基本…

《Python基础》之Pandas库

目录 一、简介 二、Pandas的核心数据结构 1、Series 2、DataFrame 三、数据读取与写入 1、数据读取 2、数据写入 四、数据清洗与处理 1、处理缺失值 2、处理重复值 3、数据转换 五、数据分析与可视化 1、统计描述 2、分组聚合 3、数据可视化 六、高级技巧 1、时…

【C语言】结构体(四)

本篇重点是typedef关键字 一,是什么? typedef用来定义新的数据类型,通常typedef与结构体的定义配合使用。 简单来说就是取别名 ▶ struct 是用来定义新的数据类型——结构体 ▶ typedef是给数据类型取别名。 二,为什么&#xf…

12月2日星期一今日早报简报微语报早读

12月2日星期一,农历十一月初二,早报#微语早读。 1、公安部:全国机动车所有人12月2日起均可申领电子行驶证; 2、2025年国考笔试开考:参考率约为86.7%,约65人录1人; 3、今日头条、拼多多等9款A…