在项目中需要用到拼音首字母查询,新增了一个字段,把原中文字段的首字母存储到另一个字段
update 表名 set 拼音字段 = fun_pinyin(原字段,true/false)
调用该存储函数,会遇到两个问题
1. 多音字不能区分
2.字符集编码报错,字段字符集类型需要为utf8mb64
CREATE DEFINER=`dev`@`%` FUNCTION `fun_pinyin`(name varchar(500), is_short bit) RETURNS varchar(1000) CHARSET utf8mb4
COMMENT '中文直接转全拼或简拼,不支持多音字'
BEGIN
/*
参数说明:
name:需要转换的字符串
is_short:是否转换为简拼,0全拼/1简拼
*/
DECLARE restr VARCHAR(1000) DEFAULT '';
DECLARE codestr VARCHAR(50) DEFAULT '';
WHILE length(name) > 0 DO
/*从字符串中取出一个字符*/
set codestr = left(name, 1);
set name = SUBSTRING(name, 2);
if not codestr REGEXP "[u0391-uFFE5]" then -- 是中文
-- 得到这个字符的拼音
SELECT a.CODE into codestr FROM sys_convert_fullpinyin a WHERE a.NAME=codestr limit 1;
end if;
-- 如果是多音字,取第一个拼音
if LOCATE(',',codestr) > 0 then
set codestr = substring(codestr,1,LOCATE(',',codestr) - 1);
end if;
if is_short = 1 then
set restr = concat(restr, left(codestr, 1));
else
set restr = concat(restr, codestr);
end if;
END WHILE;
return restr;
END