MySQL 創建存儲函數時遇到 ERROR 1418 (HY000),提示函數缺少 DETERMINISTIC、NO SQL 或 READS SQL DATA 特性聲明,且二進制日誌已啟用。這是 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)
log_bin(主從複製需求)時,MySQL 要求函數聲明確定性特性DETERMINISTIC):相同輸入必然產生相同輸出,安全複製log_bin_trust_function_creators 默認 OFF,禁止創建未聲明特性的函數CREATE FUNCTION my_func(p INT) RETURNS INT
DETERMINISTIC -- 或 NO SQL / READS SQL DATA
BEGIN
RETURN p * 2;
END;
DETERMINISTIC:無副作用,相同輸入必得相同輸出NO SQL:不包含 SQL 語句READS SQL DATA:只讀數據,不修改MODIFIES SQL DATA:修改數據(複製不安全,需謹慎)-- 會話級(重連失效)
SET GLOBAL log_bin_trust_function_creators = 1;
-- 永久生效:配置文件 my.cnf / my.ini
[mysqld]
log_bin_trust_function_creators = 1
重啟 MySQL 生效。開啟後,創建函數無需聲明特性,但開發者需自行保證函數確定性,否則主從數據可能不一致。
mysqld --log-bin-trust-function-creators=1
SHOW VARIABLES LIKE 'log_bin_trust_function_creators';
-- Value: ON 表示生效
CREATE FUNCTION 中顯式加 DETERMINISTIC 或 READS SQL DATARAND()、NOW()、UUID() 等非確定性調用| 參數 | 作用域 | 默認值 | 建議 |
|---|---|---|---|
| log_bin_trust_function_creators | GLOBAL | OFF | 函數聲明特性後可保持 OFF |
| log_bin | GLOBAL | OFF | 主庫必須 ON |
| binlog_format | GLOBAL/SESSION | ROW | 推薦 ROW 格式 |
ERROR 1418 是 MySQL 為複製安全設置的守門規則。正規做法是聲明函數特性,臨時可開啟 log_bin_trust_function_creators=1。建立「聲明特性→代碼審查→測試驗證」流程,兼顧開發效率與數據一致性。