ERROR 1418 是因开启二进制日志后,自定义函数未声明 DETERMINISTIC/NO SQL/READS SQL DATA 特性所致;可临时设 log_bin_trust_function_creators=1(需 SUPER 权限),或永久在 CREATE FUNCTION 中补全合法特性声明。
MySQL 导入报错 ERROR 1418:This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA
这是 mysql 严格模式下对自定义函数(create function)的校验失败,不是权限或语法错误,而是函数声明缺失关键特性标记。根本原因是 log_bin_trust_function_creators 被设为 off(默认值),而你又没在函数定义里显式声明确定性或数据访问行为。
- 触发场景:用
mysqldump导入含函数的 SQL 文件、执行CREATE FUNCTION语句时 - 本质原因:开启二进制日志(
log_bin=ON)后,MySQL 要求所有函数必须可安全复制,所以强制要求声明DETERMINISTIC/NO SQL/READS SQL DATA - 直接改配置最省事,但得有 SUPER 权限;加声明更规范,适合生产环境长期维护
临时绕过:SET GLOBAL log_bin_trust_function_creators = 1
如果你只是想快速导入成功(比如本地开发、测试库),且确认函数本身不写数据、不依赖会变的上下文(如 NOW()、UUID()),可以临时放开限制:
SET GLOBAL log_bin_trust_function_creators = 1;
- 该设置只对当前 MySQL 实例生效,重启后恢复默认
0 - 必须用拥有
SUPER权限的账号执行(普通root在某些版本可能不够) - 如果提示
ERROR 1227 (42501): Access denied; you need ... SUPER privilege,说明权限不足,别硬试 - 不建议在生产主库上长期开启,它会跳过函数安全性检查,影响主从一致性
永久修复:在 CREATE FUNCTION 中补全特性声明
真正解决问题的方式,是在函数定义里明确加上 DETERMINISTIC 或其它合法修饰符。例如原语句:
CREATE FUNCTION my_add(a INT, b INT) RETURNS INT BEGIN RETURN a + b; END
改成:
CREATE FUNCTION my_add(a INT, b INT) RETURNS INT READS SQL DATA DETERMINISTIC BEGIN RETURN a + b; END
-
DETERMINISTIC:输出只取决于输入参数(如纯计算函数) -
READS SQL DATA:函数内只读查询表,不修改 -
NO SQL:完全不碰数据库(比如只调用CONCAT()、UNIX_TIMESTAMP()) - 三者选其一即可,不能同时写多个,也不能都不写
- 注意:如果函数里用了
RAND()、NOW()、子查询带非确定性逻辑,就不能标DETERMINISTIC,否则主从结果可能不一致
检查与验证:确认 log_bin 和当前设置是否匹配
别假设配置已生效。先查清楚实际状态,再动手:
SHOW VARIABLES LIKE 'log_bin';
SHOW VARIABLES LIKE 'log_bin_trust_function_creators';
- 如果
log_bin是OFF却还报 1418,说明你连的不是目标实例,或者配置文件里写了但没生效(比如没重启或SET PERSIST没用对) - 如果
log_bin_trust_function_creators是ON还报错,大概率是函数 SQL 本身语法有误(比如漏了DELIMITER),和这个变量无关 - 配置文件中设置需写在
[mysqld]下:log_bin_trust_function_creators = 1,然后重启 MySQL
真正麻烦的是那种函数体里混着 SELECT、INSERT、时间函数、用户变量的“黑盒函数”——它既难标 DETERMINISTIC,又不该开 log_bin_trust_function_creators。这种得拆开重写,或者换存储过程+应用层控制。










