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的补充。

MySQL本身不支持中文拼音首字母换,但可以借助第三方库或插件实现。 一种常用的方法是使用MySQL的UDF(User-Defined Function)机制,通过编写自定义函数来实现中文拼音首字母换。 以下是一个使用MySQL UDF实现中文拼音首字母换的示例: 1. 安装pinyin库 pinyin是一个基于Python的中文拼音换库,可以将汉字换为拼音。 首先需要安装pinyin库,可以使用pip命令进行安装: ``` pip install pinyin ``` 2. 编写MySQL UDF 使用Python编写一个将中文字符串换为拼音首字母的函数,并将其封装为MySQL UDF。 ```python import pinyin from mysql.connector import connect, Error def pinyin_first_letter(s): pinyin_list = pinyin.lazy_pinyin(s, style=pinyin.Style.FIRST_LETTER) return ''.join(pinyin_list) def mysql_pinyin_first_letter(s): conn = connect( user='root', password='password', host='localhost', database='test' ) cursor = conn.cursor() cursor.execute("SELECT pinyin_first_letter('%s')" % s) result = cursor.fetchone()[0] cursor.close() conn.close() return result ``` 将上述代码保存为一个Python文件,例如pinyin_udf.py。 3. 编译MySQL UDF 使用MySQL提供的插件编译器(plugin_compile)将Python函数编译为MySQL UDF。 ```sh plugin_compile -i python -o mysql pinyin_udf.py ``` 如果编译成功,将在当前目录下生成一个名为pinyin_udf.so的文件。 4. 加载MySQL UDF 将编译生成的pinyin_udf.so文件复制到MySQL插件目录下,例如: ```sh sudo cp pinyin_udf.so /usr/lib/mysql/plugin/ ``` 在MySQL客户端中执行以下命令加载UDF: ```sql CREATE FUNCTION pinyin_first_letter RETURNS STRING SONAME 'pinyin_udf.so'; ``` 5. 使用MySQL UDF 现在可以通过调用pinyin_first_letter函数来将中文字符串换为拼音首字母了: ```sql SELECT pinyin_first_letter('中国'); -- 返回 'zg' SELECT pinyin_first_letter('中华人民共和国'); -- 返回 'zhrmghg' ```
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

怪 咖@

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

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

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

打赏作者

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

抵扣说明:

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

余额充值