报error 1418是因为binlog启用时,mysql要求函数必须声明deterministic、no sql或reads sql data,否则拒绝创建;解决需按实际行为添加对应特性子句或临时设置log_bin_trust_function_creators=1。
MySQL 自定义函数不能在普通用户权限下直接创建,必须拥有 CREATE ROUTINE 权限,且默认情况下 log_bin_trust_function_creators 为 OFF —— 这会导致创建失败并报错 ERROR 1418。
为什么执行 CREATE FUNCTION 报 ERROR 1418?
这是 MySQL 的安全限制:当二进制日志(binlog)启用时,系统要求确定性函数(DETERMINISTIC)、或显式声明为 READS SQL DATA/NO SQL,否则拒绝创建。常见错误信息是:
ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled
解决方法不是简单加 DETERMINISTIC(它必须真实符合函数行为),而是按需选择以下之一:
- 如果函数确实不读写数据,加上
DETERMINISTIC或NO SQL - 如果函数会查表,必须加
READS SQL DATA - 临时关闭校验(仅测试环境):
SET GLOBAL log_bin_trust_function_creators = 1
创建带参数和返回值的标量函数
MySQL 函数只能返回单个值(标量),不能返回结果集。定义时需明确指定参数类型、返回类型、特性子句。例如,写一个截取手机号后 4 位的函数:
DELIMITER $$ CREATE FUNCTION get_phone_tail(p_phone VARCHAR(20)) RETURNS VARCHAR(4) READS SQL DATA DETERMINISTIC BEGIN RETURN RIGHT(TRIM(p_phone), 4); END$$ DELIMITER ;
注意点: