今天要做乙個排序,有中文和英文的,資料庫採用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...