今天啓用了MySQL二進制日誌,而後再使用MySQL建立函數,運行語句進行建立時老是報以下錯誤:數據庫
[Err] 1418 - 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)服務器
經查閱資料發現原來是由於啓用了MySQL的二進制日誌形成的,通過屢次嘗試發現了三種解決方案。less
方案一函數
在建立函數的同時爲函數指定一個參數,明確指出函數的類型。由於數據庫啓用bin-log後,在進行主從複製必需要知道這個函數的類型才能同步數據,所以在聲明函數時咱們必須指定咱們的函數的類型,MySQL支持的參數類型有如下五種:spa
1. DETERMINISTIC 不肯定的日誌
2. NO SQL 沒有SQl語句,固然也不會修改數據blog
3. READS SQL DATA 只是讀取數據,固然也不會修改數據同步
4. MODIFIES SQL DATA 要修改數據it
5. CONTAINS SQL 包含了SQL語句io
方案二
將log_bin_trust_function_creators 設置爲1,啓動MySQL運行下面命令:
set GLOBAL log_bin_trust_function_creators=1;
由於二進制日誌的一個重要功能是用於主從複製,而存儲函數有可能致使主從的數據不一致。因此當開啓二進制日誌後,參數log_bin_trust_function_creators就會生效,限制存儲函數的建立、修改、調用。所以,設置這個參數就至關於明確告知MySQL服務器這個函數不會修改數據,這樣就能順利進行函數的建立。
默認 log_bin_trust_function_creators=0,處於關閉狀態
設置 log_bin_trust_function_creators=1,處於開啓狀態
設置好以後就能夠直接建立函數了