mysql 自定義函式

2021-07-05 00:00:06 字數 3263 閱讀 8623

今天要做乙個排序,有中文和英文的,資料庫採用utf8編碼,排除來的不對,所以需要將中文轉換成中文的第乙個字母,然後來排序

先小小的看一下mysql的自定義函式

drop function if exists `fntable`;##如果存在就刪除

delimiter $$  ##函式開始

create function fntable( ##定義函式名

param_1 varchar(50),## 定義引數

param_2 varchar(50)##定義第二個引數

)returns varchar(50) ##返回結果

begin##函式體開始

declare total varchar(50);##定義變數

set total=param_1;##賦值

return total;##返回結果

end $$##函式體結束

這是個小函式,可以從這個小函式上慢慢增加最後寫出來自定義函式

我開始學程式設計的第乙個程式,並不是helloword,是從1+到100.這裡補充乙個小函式也是從1開始加,加到n,mysql函式

drop function if exists `fntable`; 

delimiter $$

create function fntable(

temp_n int

)returns int

begin

declare total int;

declare temp_i int;

set total=0;

set temp_i=0;

while temp_i < temp_n do

begin

set temp_i=temp_i+1;

set total=temp_i+total;

end;

end while;

return total;

end $$

select fntable(100);

如果掌握了一門語言,這個還是很好理解啦

上面都是mysql的sql語句語法。函式體內可以使用sql語句,還有別的,一樣有迴圈語句,if判斷什麼的,應該很好理解

然後漢字轉換成首字母的sql語句:,這裡注意的是,gbk的編碼的一級編碼才是按照拼音排序的,也就是說有一部分返回的首字母是不正確的,但姓名所用到的字不多,所以可以使用這種方式

select elt(interval(conv(hex(convert('當' using gbk)),16,10),0xb0a1,0xb0c5,0xb2c1,0xb4ee,0xb6ea,0xb7a2,0xb8c1,0xb9fe,0xbbf7,0xbfa6,0xc0ac

,0xc2e8,0xc4c3,0xc5b6,0xc5be,0xc6da,0xc8bb,0xc8f6,0xcbfa,0xcdda ,0xcef4,0xd1b9,0xd4d1),

'a','b','c','d','e','f','g','h','j','k','l','m','n','o','p','q','r','s','t','w','x','y','z')

結果為d

然後乙個個從傳遞過來的字串裡將字串裡的中文乙個個轉換即可,然後裝載乙個varchar的變數裡面,返回即可

這裡從網上找到乙個現成可以用的,寫的不錯 **:

drop function if exists `pyin`;

delimiter $$

create function `pyin`(in_string varchar(20)) returns mediumtext charset utf8

begin

declare tmp_str varchar(20) charset gbk default '' ; #擷取字串,每次做擷取後的字串存放在該變數中,初始為函式引數in_string值

declare tmp_len smallint default 0;#tmp_str的長度

declare tmp_char varchar(2) charset gbk default '';#擷取字元,每次 left(tmp_str,1) 返回值存放在該變數中

declare tmp_rs varchar(20) charset gbk default '';#結果字串

declare tmp_cc varchar(2) charset gbk default '';#拼音字元,存放單個漢字對應的拼音首字元

set tmp_str = in_string;#初始化,將in_string賦給tmp_str

set tmp_len = length(tmp_str);#初始化長度

while tmp_len > 0 do #如果被計算的tmp_str長度大於0則進入該while

set tmp_char = left(tmp_str,1);#獲取tmp_str最左端的首個字元,注意這裡是獲取首個字元,該字元可能是漢字,也可能不是。

set tmp_cc = tmp_char;#左端首個字元賦值給拼音字元

if length(tmp_char)>1 then#判斷左端首個字元是多位元組還是單位元組字元,要是多位元組則認為是漢字且作以下拼音獲取,要是單位元組則不處理。

select elt(interval(conv(hex(convert(tmp_char using gbk)),16,10),0xb0a1,0xb0c5,0xb2c1,0xb4ee,0xb6ea,0xb7a2,0xb8c1,0xb9fe,0xbbf7,0xbfa6,0xc0ac

,0xc2e8,0xc4c3,0xc5b6,0xc5be,0xc6da,0xc8bb,0xc8f6,0xcbfa,0xcdda ,0xcef4,0xd1b9,0xd4d1),

'a','b','c','d','e','f','g','h','j','k','l','m','n','o','p','q','r','s','t','w','x','y','z') into tmp_cc; #獲得漢字拼音首字元

end if;

set tmp_rs = concat(tmp_rs,tmp_cc);#將當前tmp_str左端首個字元拼音首字元與返回字串拼接

set tmp_str = substring(tmp_str,2);#將tmp_str左端首字元去除

set tmp_len = length(tmp_str);#計算當前字串長度

end while;

return tmp_rs;#返回結果字串

end $$

mysql自定義函式優點 MySQL自定義函式

在使用 mysql 的過程中,mysql 自帶的函式可能完成不了我們的業務需求,這時候就需要自定義函式。自定義函式是一種與儲存過程十分相似的過程式資料庫物件。它與儲存過程一樣,都是由 sql 語句和過程式語句組成的 片段,並且可以被應用程式和其他 sql 語句呼叫。自定義函式與儲存過程之間存在幾點區...

mysql自定義函式命名 MySQL自定義函式

在使用 mysql 的過程中,mysql 自帶的函式可能完成不了我們的業務需求,這時候就需要自定義函式。自定義函式是一種與儲存過程十分相似的過程式資料庫物件。它與儲存過程一樣,都是由 sql 語句和過程式語句組成的 片段,並且可以被應用程式和其他 sql 語句呼叫。自定義函式與儲存過程之間存在幾點區...

Mysql自定義函式

今天寫乙個簡單點的自定義函式muniu 實現兩個數的加減muniu a,b,op drop function if exists muniu delimiter create function muniu a int 11 b int 11 op varchar 50 returns int beg...