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