MySQL获取汉字的拼音首字母

一、函数

这里是通过函数调用进行获取汉字的拼音首字母。

DELIMITER $$
CREATE FUNCTION `pinyin`(P_NAME VARCHAR(255)) RETURNS varchar(255) CHARSET utf8
DETERMINISTIC
BEGIN
    DECLARE V_COMPARE VARCHAR(255);
    DECLARE V_RETURN VARCHAR(255);
    DECLARE I INT;
    SET I = 1;
    SET V_RETURN = '';
	#循环截取字符
    while I < LENGTH(P_NAME) do
        SET V_COMPARE = SUBSTR(P_NAME, I, 1);
        IF (V_COMPARE != '') THEN
		    #字符串拼接
            SET V_RETURN = CONCAT(V_RETURN, to_frist_pinyin(V_COMPARE));
        END IF;
        SET I = I + 1;
    end while;
    IF (ISNULL(V_RETURN) or V_RETURN = '') THEN
        SET V_RETURN = P_NAME;
    END IF;
    RETURN V_RETURN;
END$$



CREATE FUNCTION `to_frist_pinyin`(P_NAME VARCHAR(255)) RETURNS varchar(255) CHARSET utf8
BEGIN
    DECLARE V_RETURN VARCHAR(255);
	DECLARE V_FIRST_CHAR VARCHAR(255);
	#这块主要意思是假如传入的是英文串的话,只取首字母
	set V_FIRST_CHAR =UPPER(LEFT(CONVERT(P_NAME USING gbk),1));
	set V_RETURN = V_FIRST_CHAR;
#如果是这些特殊符号,直接返回#	
IF V_FIRST_CHAR in ('(',')','《','》')
THEN SET V_RETURN = '';
#两个不相等只有一个情况,V_FIRST_CHAR是中文汉字或者中文符号。
elseif LENGTH( V_FIRST_CHAR) <> CHARACTER_LENGTH( V_FIRST_CHAR )
			then	
				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');
#如果是下面的直接原样输出					
elseif V_FIRST_CHAR in ('A','B','C','D','E','F','G','H','J','K','L','M','N','O','P','Q','R','S','T','W','X','Y','Z',
												'1','2','3','4','5','6','7','8','9','0','*','+','-','=','/','\\','{','}','[',']','(',')','(',')')
			then SET V_RETURN = V_RETURN;
#其他的输出#				
else 
			SET V_RETURN = '#';
END IF;
		#为空的话输出#
		RETURN IFNULL(V_RETURN,'#');
END$$
DELIMITER ;

二、执行遇到问题

在这里插入图片描述
设置为1,创建完后,可以再设置回去。

set global log_bin_trust_function_creators = 1;

简单介绍一下,当二进制日志启用后,这个变量就会启用。它控制是否可以信任存储函数创建者,不会创建写入二进制日志引起不安全事件的存储函数。如果设置为0(默认值),用户不得创建或修改存储函数,除非它们具有除CREATE ROUTINE或ALTER ROUTINE特权之外的SUPER权限。 设置为0还强制使用DETERMINISTIC特性或READS SQL DATA或NO SQL特性声明函数的限制。 如果变量设置为1,MySQL不会对创建存储函数实施这些限制。

三、如何使用

将某个表当中的按照名称给pym字段赋值。

UPDATE therapy_standard a SET name_pym = pinyin ( NAME );
SELECT pinyin ( '张三abc' );

在这里插入图片描述

四、常见的函数

1、CONVERT()提供一个在不同字符集之间转换数据的方法。
用法:CONVERT('张' USING gbk)
2、LEFT()函数是一个字符串截取函数,它返回具有指定长度的字符串的左边部分。
用法:LEFT(Str,length)

  • str:一个字符串;
  • length:想要截取的长度,是一个正整数;

注意这里的length是字符,也就是不管str包含的是汉字还是数字或者是字母都算是一个字符。

3、upper()函数将所有字符串更改为大写,然后返回。
4、LENGTH()函数:查看某字符串的长度,这里的单位是字节。

  • utf8编码下,一个汉字三个字节,一个数字或字母一个字节。
  • gbk下,一个汉字两个字节,一个数字或字母一个字节。

5、CHARACTER_LENGTH()函数:函数返回字符串的长度,单位为字符。

  • 不管汉字还是数字或者是字母都算是一个字符
    6、HEX()函数:返回十六进制值的字符串表示形式。注意:并不是十进制转化为十六进制数,而是转化为字符串。。。

7、UNHEX() 函数: 每对十六进制数字转化为一个字符。
8、conv()函数:这个函数是用来将字符转换进制的,例如将a转成ASCII码(换个说法就是将16进制的a换成10进制)那就直接用conv(hex(‘a’),16,10)
9、INTERVAL()函数:用法INTERVAL(N,N1,N2,N3,…),其中,N是要判断的数值,N1,N2,N3,…是分段的间隔。

SELECT id,percent,INTERVAL(percent,25,50) from test;

意思大概是这样的:percent字段参与判断,设定的区段是25,50,那么小于25的值返回0,大于等于25小于50的值返回1,大于等于50的值返回2。
10、INTERVAL关键字:查询当前时间之前2个小时的日期:SELECT NOW()-INTERVAL '2' HOUR;
11、ELT()函数:ELT(N,str1,str2,str3,…)
如果N = 1,则返回str1;如果N = 2,则返回str2,依此类推。 如果N小于1或大于参数个数,则返回NULL。 ELT是FIELD的补充。

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

怪 咖@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值