话不多说,直接上代码:
# 解决报错:This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA
set global log_bin_trust_function_creators=TRUE;
# 加上这句防止重复定义函数
# DROP FUNCTION IF EXISTS `firstPinyin`;
DELIMITER $$
CREATE DEFINER=`root`@`%` FUNCTION `firstPinyin`(P_NAME VARCHAR(255)) RETURNS varchar(255) CHARSET utf8mb4 COLLATE utf8mb4_general_ci
begin
DECLARE V_RETURN VARCHAR(255);
DECLARE V_BOOL INT DEFAULT 0;
DECLARE FIRST_VARCHAR VARCHAR(1);
DECLARE V_NUMBER INT DEFAULT 0;
DECLARE V_OUTWORD VARCHAR(255) DEFAULT NULL;
SET FIRST_VARCHAR = left(CONVERT(P_NAME USING gbk),1);
SELECT `py` FROM `t_pinyin` WHERE `zi`=FIRST_VARCHAR INTO V_OUTWORD;
IF V_OUTWORD IS NOT NULL OR V_OUTWORD <> "" THEN
SET V_RETURN = UPPER(LEFT(V_OUTWORD, 1));
ELSE
SELECT FIRST_VARCHAR REGEXP '[0-9]' INTO V_NUMBER;
IF V_NUMBER = 1 THEN
SET V_RETURN = ELT(FIRST_VARCHAR + 1, 'L','Y','E','S','S','W','L','Q','B','J');
ELSE
SELECT FIRST_VARCHAR REGEXP '[a-zA-Z]' INTO V_BOOL;
IF V_BOOL = 1 THEN
SET V_RETURN = UPPER(FIRST_VARCHAR);
ELSE
SET V_RETURN = ELT(INTERVAL(CONV(HEX(left(CONVERT(P_NAME USING gbk),1)),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');
END IF;
END IF;
END IF;
return V_RETURN;
#return date_format(mydate,'%Y-%m'); -- 函数需要返回值,return返回相应的处理结果
end$$
DELIMITER ;
知识点:
1、ELT(N, string1, string2, string3, string4, …)
参数:
该方法接受上面提到的和下面描述的两个参数。
- N:它是一个整数,是要检索的字符串的索引。
- 字符串1,字符串2,字符串3:我们要从中检索的字符串列表。
返回-
它在指定的索引处返回一个字符串。如果指定的索引N处没有字符串,则返回NULL。例子:
Select ELT(4, 'Learning', 'SQL', 'at', 'geeksforgeeks', 'is', 'fun') As Res_Str;上面语句输出:geeksforgeeks
2、INTERVAL(N,N1,N2,N3,…)
其中,N是要判断的数值,N1,N2,N3,…是分段的间隔。
这个函数的返回值是段的位置:
如果N<N1,则返回0,
如果N1<=N<N2,则返回1,
如果N2<=N<N3,则返回2。
所以,区间是前闭后开的。
3、LEFT(str,length);
str
是要提取子字符串的字符串。length
是一个正整数,指定将从左边返回的字符数。
LEFT()
函数返回str
字符串中最左边的长度字符。如果str
或length
参数为NULL
,则返回NULL
值。
4、CONVERT(s USING cs)
函数将字符串 s 的字符集变成 cs。
例如:
SELECT CHARSET(CONVERT('ABC' USING gbk))
5、UPPER(s)
将字符串转换为大写。
例如:
将字符串 runoob 转换为大写:
SELECT UPPER("runoob"); -- RUNOOB
6、CONV(x,f1,f2)
返回 f1 进制数变成 f2 进制数
例如:SELECT CONV(15, 10, 2); -> 1111
7、Hex(str)
将指定内容(str)转换为16进制,这个str可以是数值或字符串。
以上用到一个生僻汉字拼音表,解决生僻汉字拼音转换错误的问题,表格资源地址:生僻汉字拼音表