需求簡介:最近的一個項目,想實現如下圖所示的顯示效果。很明顯,如果能夠獲取對應的漢字詞組中每個漢字的拼音首字母就可以實現了,如果是固定的幾組漢字,人為的拼一下就可以 了,不過項目中有多處功能需要這個效果,並且事先也不知道對應的漢字是什么,所以就需要一個函數來完成這件事情了,根據網上查詢的資料自己改進了一個 函數實現的效果,現分享如下。
1:閱讀建議
如果你還沒有看過我上一篇博文——MySQL數據庫獲取漢字拼音的首字母函數,強烈建議請先看一下,因為本篇博文是在她的基礎之上寫的,相關雷同的描述,本文就不再啰嗦了,比如:測試環境、測試數據、函數的編寫說明、函數的使用簡介等。本篇博文所介紹的函數,無非是針對多個漢字獲取其拼音的首字母的,和上一篇博文相比僅多了一層循環處理,其他的基本一致。
2:測試功能
測試的函數的功能為,根據漢字詞組或者單個漢字,獲取其對應的拼音首字母,比如:你愛我嗎?獲取的是 NAWM? ,如果是非漢字字符則不做處理。
3:函數代碼
DELIMITER $$ USE `test`$$ DROP FUNCTION IF EXISTS `getPY`$$ CREATE DEFINER=`hjd`@`%` FUNCTION `getPY`(in_string VARCHAR(21845)) RETURNS VARCHAR(21845) CHARSET utf8 BEGIN #截取字符串,每次做截取后的字符串存放在該變量中,初始為函數參數in_string值 DECLARE tmp_str VARCHAR(21845) CHARSET gbk DEFAULT '' ; #tmp_str的長度 DECLARE tmp_len SMALLINT DEFAULT 0; #tmp_str的長度 DECLARE tmp_loc SMALLINT DEFAULT 0; #截取字符,每次 left(tmp_str,1) 返回值存放在該變量中 DECLARE tmp_char VARCHAR(2) CHARSET gbk DEFAULT ''; #結果字符串 DECLARE tmp_rs VARCHAR(21845)CHARSET gbk DEFAULT ''; #拼音字符,存放單個漢字對應的拼音首字符 DECLARE tmp_cc VARCHAR(2) CHARSET gbk DEFAULT ''; #初始化,將in_string賦給tmp_str SET tmp_str = in_string; #初始化長度 SET tmp_len = LENGTH(tmp_str); #如果被計算的tmp_str長度大於0則進入該while WHILE tmp_len > 0 DO #獲取tmp_str最左端的首個字符,注意這里是獲取首個字符,該字符可能是漢字,也可能不是。 SET tmp_char = LEFT(tmp_str,1); #左端首個字符賦值給拼音字符 SET tmp_cc = tmp_char; #獲取字符的編碼范圍的位置,為了確認漢字拼音首字母是那一個 SET tmp_loc=INTERVAL(CONV(HEX(tmp_char),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); #判斷左端首個字符是多字節還是單字節字符,要是多字節則認為是漢字且作以下拼音獲取,要是單字節則不處理。如果是多字節字符但是不在對應的編碼范圍之內,即對應的不是大寫字母則也不做處理,這樣數字或者特殊字符就保持原樣了 IF (LENGTH(tmp_char)>1 AND tmp_loc>0 AND tmp_loc<24) THEN #獲得漢字拼音首字符 SELECT ELT(tmp_loc,'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; #將當前tmp_str左端首個字符拼音首字符與返回字符串拼接 SET tmp_rs = CONCAT(tmp_rs,tmp_cc); #將tmp_str左端首字符去除 SET tmp_str = SUBSTRING(tmp_str,2); #計算當前字符串長度 SET tmp_len = LENGTH(tmp_str); END WHILE; #返回結果字符串 RETURN tmp_rs; END$$ DELIMITER ;
4:函數的使用效果
5:理解函數思想的參看資料
http://www.4jhm.com/hzcode/queryg.php?enter=CED2
http://zd.diyifanwen.com/zidian/py/
http://www.qqxiuzi.cn/zh/hanzi-gbk-bianma.php
6:函數說明
整個函數,如果明白了各個系統函數的使用方式,就沒有什么不好理解的了,就有一個函數的使用有些不太好理解,如下所示:
SET tmp_loc=INTERVAL(CONV(HEX(tmp_char),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);
這個函數的功能是比較簡單的,就是進行比較列表(N1,N2,N3等等)中的N值。該函數如果N<N1返回0,如果N<N2返回1,如果N<N3返回2 等等。如果N為NULL,它將返回-1。列表值必須是N1<N2<N3的形式才能正常工作。
如下表所示,就是函數中N1/N2/N3等等所表示的含義,如何通過 GBK編碼表 就能比較好的理解了,這些GBK編碼表示的漢字都是對應的字母開頭的拼音中的第一個漢字,通過這種方式就能判斷出一個漢字的拼音首字母是那個字母了。
序號 | GBK內碼 | Uni碼 | 漢字 | 字符集 |
1 | B0A1 | 554A | 啊 | GBK |
2 | B0C5 | 82AD | 芭 | GBK |
3 | B2C1 | 64E6 | 擦 | GBK |
4 | B4EE | 642D | 搭 | GBK |
5 | B6EA | 86FE | 蛾 | GBK |
6 | B7A2 | 53D1 | 發 | GBK |
7 | B8C1 | 5676 | 噶 | GBK |
8 | B9FE | 54C8 | 哈 | GBK |
9 | BBF7 | 51FB | 擊 | GBK |
10 | BFA6 | 5580 | 喀 | GBK |
11 | C0AC | 5783 | 垃 | GBK |
12 | C2E8 | 5988 | 媽 | GBK |
13 | C4C3 | 62FF | 拿 | GBK |
14 | C5B6 | 54E6 | 哦 | GBK |
15 | C5BE | 556A | 啪 | GBK |
16 | C6DA | 671F | 期 | GBK |
17 | C8BB | 7136 | 然 | GBK |
18 | C8F6 | 6492 | 撒 | GBK |
19 | CBFA | 584C | 塌 | GBK |
20 | CDDA | 6316 | 挖 | GBK |
21 | CEF4 | 6614 | 昔 | GBK |
22 | D1B9 | 538B | 壓 | GBK |
23 | D4D1 | 531D | 匝 | GBK |