在之前處理數(shù)據(jù)庫查詢JSON數(shù)據(jù)UNICODE編碼的字符在查詢的結(jié)果轉(zhuǎn)換成中文的之后,因?yàn)椴樵冎刑幚硇枰獙懞荛L得代碼來實(shí)現(xiàn)想要的結(jié)果,所以我就想著把這個(gè)過程寫成一個(gè)函數(shù)來簡化代碼,方便使用。
那么就要介紹一下MYSQL的函數(shù)了,mysql的函數(shù)有兩種一種是存儲過程,另外一種就是函數(shù),其中,函數(shù)(UDF)必須返回一個(gè)值。函數(shù)的返回值類型在創(chuàng)建函數(shù)時(shí)定義,并且函數(shù)的主體必須包含一個(gè)有效的返回語句。存儲過程可以沒有返回值,也可以返回多個(gè)值(通過輸出參數(shù)或結(jié)果集)。它們主要用于執(zhí)行操作,而不是計(jì)算并返回一個(gè)值。
函數(shù)可以從SQL語句的任何位置調(diào)用,就像在查詢中使用的內(nèi)置函數(shù)(如CONCAT(), LENGTH()等)一樣。
存儲過程通常通過CALL語句來調(diào)用,并且不能直接在SQL語句中作為表達(dá)式的一部分使用。
今天在創(chuàng)建函數(shù)的時(shí)候,報(bào)了個(gè)錯(cuò)This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled。
報(bào)錯(cuò)的原因是啥呢,是因?yàn)閿?shù)據(jù)庫開啟了bin-log, 我們就需要指定函數(shù)的特性DETERMINISTIC、NO SQL或READS SQL DATA這三個(gè)特性之一。
以下是這三個(gè)特性的簡要說明:
DETERMINISTIC:表明函數(shù)對于相同的輸入總是返回相同的輸出。如果函數(shù)是確定的,那么MySQL可以安全地將其結(jié)果緩存起來,并在二進(jìn)制日志中記錄函數(shù)名和其參數(shù),而不是實(shí)際的結(jié)果值。
NO SQL:表明函數(shù)不包含任何SQL語句。如果函數(shù)不包含SQL語句,那么它不會修改數(shù)據(jù)庫中的數(shù)據(jù),也不會受到并發(fā)執(zhí)行的其他事務(wù)的影響。
READS SQL DATA:表明函數(shù)包含讀取數(shù)據(jù)的SQL語句,但不包含修改數(shù)據(jù)的語句。這意味著函數(shù)可能會讀取數(shù)據(jù)庫中的值,但不會修改它們。
如果不想這樣的話也可以在配置文件中配置log_bin_trust_function_creators=1來關(guān)閉。
也可以通過執(zhí)行sql語句:SET GLOBAL log_bin_trust_function_creators = 1。