MySQL自定義函數(shù):
整理下MySQL自定義函數(shù)的使用,以前用的時(shí)候沒(méi)整理下來(lái),現(xiàn)在來(lái)邊回顧邊記錄下。
我們平時(shí)寫SQL的時(shí)候,都會(huì)用到系統(tǒng)函數(shù),什么字符串函數(shù),日期函數(shù),這都是每個(gè)數(shù)據(jù)庫(kù)自帶的,當(dāng)這些函數(shù)不能滿足我們的需求的時(shí)候,我們也可以自定義函數(shù),怎么操作呢?
語(yǔ)法
CREATE
[DEFINER = user]
FUNCTION sp_name ([func_parameter[,...]])
RETURNS type
[characteristic ...] routine_body
func_parameter:
param_name type
type:
Any valid MySQL data type
characteristic:
COMMENT 'string'
| LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
routine_body:
Valid SQL routine statement
create function 就是創(chuàng)建一個(gè)函數(shù)的基本語(yǔ)法,然后我們得有函數(shù)名,我們定義的函數(shù)有沒(méi)有參數(shù),返回值是什么,然后就是具體的邏輯了。
Hello World!
好了,我們來(lái)一個(gè)MySQL UDF版的Hello World
create function say_hi() returns varchar(20)
return 'hello world!'
;
每次調(diào)用這個(gè)函數(shù),就會(huì)返回'hello world!'
下面,進(jìn)階一下,我們傳個(gè)參數(shù)進(jìn)去,
create function say_hi_to_you(user_name varchar(10)) returns varchar(20)
return concat('hello ',user_name)
;
實(shí)際用的時(shí)候,也和其他函數(shù)一樣,
-
注意
這時(shí)候,我們傳個(gè)中文的名字試試
看上去,像是字符編碼的問(wèn)題,然后,在網(wǎng)上找了找,沒(méi)有找到類似的問(wèn)題,但是,隱約感覺(jué)可以通過(guò)增加字符編碼搞定,就試了下
create function say_hi_to_you(user_name varchar(10)) returns varchar(20) charset utf8
return user_name;
我就在函數(shù)返回的時(shí)候,加上了utf-8編碼,但是還是不行,困惑了好一會(huì)兒,想到,返回值設(shè)置了編碼,參數(shù)應(yīng)該也可以設(shè)置編碼吧,就改了下
create function say_hi_to_you(user_name varchar(10) charset utf8) returns varchar(20) charset utf8
return user_name;
這下可以了,我感覺(jué)這個(gè)應(yīng)該和數(shù)據(jù)庫(kù)配置有關(guān),我這里沒(méi)有該數(shù)據(jù)庫(kù)默認(rèn)編碼為UTF-8,如果改了的話,估計(jì)沒(méi)有這個(gè)問(wèn)題。
簡(jiǎn)單使用篇想到這里了。
參考文檔
官方介紹:https://dev.mysql.com/doc/refman/5.7/en/create-procedure.html