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 強制要求函數/觸發器聲明確定性特性,防止主從同步數據不一致。函數僅支援三種聲明:
-- 純計算函數
CREATE FUNCTION hello(s CHAR(20))
RETURNS CHAR(50)
DETERMINISTIC
RETURN CONCAT('hello ', s, '!');
-- 查詢類函數
CREATE FUNCTION get_cid(n CHAR(20))
RETURNS INT
READS SQL DATA
BEGIN
RETURN (SELECT cid FROM stu WHERE sname = n);
END;
SET GLOBAL log_bin_trust_function_creators = 1;
# /etc/my.cnf [mysqld] log_bin_trust_function_creators = 1
SHOW VARIABLES LIKE 'log_bin_trust_function_creators'; -- Value: ON
⚠️ 生產環境嚴禁長期開啟:允許創建不確定性函數 (如包含 UUID()、隨機寫入邏輯),會導致主從數據不一致。僅作為開發調試臨時手段,上線前必須改用方案一。
官方定義:NOW() 記錄時間戳到 binlog,RAND() 種子同步,兩者在主從重放時行為確定,包含它們的函數仍可聲明 DETERMINISTIC。
ERROR 1418 是 binlog 安全機制的體現。標準流程:分析函數屬性 → 添加 DETERMINISTIC/READS SQL DATA/NO SQL 聲明 → 代碼評審強制檢查。信任模式僅作為開發階段臨時繞過,生產環境零容忍。