拼音函数和添加管理存储过程
拼音函数和添加管理存储过程
SQL 脚本
----------------------辅助查询-------------------------------
-- 汉字拼音首字母映射表
CREATE TABLE `chinese_char_pinyin` (
`char` VARCHAR(1) NOT NULL COMMENT '汉字',
`pinyin` VARCHAR(20) NOT NULL COMMENT '完整拼音',
`first_letter` CHAR(1) NOT NULL COMMENT '拼音首字母',
PRIMARY KEY (`char`),
INDEX `idx_first_letter` (`first_letter`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='汉字拼音首字母映射表';
-- 插入全面的汉字拼音首字母映射
INSERT INTO `chinese_char_pinyin` (`char`, `pinyin`, `first_letter`) VALUES
-- ==================== 常见繁体字 ====================
('壹', 'yi', 'Y'), ('贰', 'er', 'E'), ('叁', 'san', 'S'), ('肆', 'si', 'S'),
('伍', 'wu', 'W'), ('陆', 'lu', 'L'), ('柒', 'qi', 'Q'), ('捌', 'ba', 'B'),
('玖', 'jiu', 'J'), ('拾', 'shi', 'S'), ('佰', 'bai', 'B'), ('仟', 'qian', 'Q'),
('萬', 'wan', 'W'), ('億', 'yi', 'Y'), ('兆', 'zhao', 'Z'),('旻', 'yian', 'Y'),
('國', 'guo', 'G'), ('與', 'yu', 'Y'), ('並', 'bing', 'B'), ('個', 'ge', 'G'),
('關', 'guan', 'G'), ('會', 'hui', 'H'), ('長', 'chang', 'C'), ('這', 'zhe', 'Z'),
('實', 'shi', 'S'), ('麗', 'li', 'L'), ('麼', 'me', 'M'), ('義', 'yi', 'Y'),
('來', 'lai', 'L'), ('號', 'hao', 'H'), ('門', 'men', 'M'), ('問', 'wen', 'W'),
('無', 'wu', 'W'), ('還', 'huan', 'H'), ('當', 'dang', 'D'), ('體', 'ti', 'T'),
('處', 'chu', 'C'), ('髮', 'fa', 'F'), ('電', 'dian', 'D'), ('話', 'hua', 'H'),
('應', 'ying', 'Y'), ('對', 'dui', 'D'), ('產', 'chan', 'C'), ('種', 'zhong', 'Z'),
('務', 'wu', 'W'), ('給', 'gei', 'G'), ('園', 'yuan', 'Y'), ('語', 'yu', 'Y'),
('發', 'fa', 'F'), ('說', 'shuo', 'S'), ('讀', 'du', 'D'), ('線', 'xian', 'X'),
('時', 'shi', 'S'), ('書', 'shu', 'S'), ('華', 'hua', 'H'), ('東', 'dong', 'D'),
('車', 'che', 'C'), ('會', 'hui', 'H'), ('見', 'jian', 'J'), ('頭', 'tou', 'T'),
('學', 'xue', 'X'), ('過', 'guo', 'G'), ('點', 'dian', 'D'), ('單', 'dan', 'D'),
('鳥', 'niao', 'N'), ('馬', 'ma', 'M'), ('樂', 'le', 'L'), ('數', 'shu', 'S'),
('風', 'feng', 'F'), ('愛', 'ai', 'A'), ('師', 'shi', 'S'), ('寶', 'bao', 'B'),
('響', 'xiang', 'X'), ('達', 'da', 'D'), ('麵', 'mian', 'M'), ('變', 'bian', 'B'),
('離', 'li', 'L'), ('龍', 'long', 'L'), ('燈', 'deng', 'D'), ('雲', 'yun', 'Y'),
('權', 'quan', 'Q'), ('論', 'lun', 'L'), ('貓', 'mao', 'M'), ('錯', 'cuo', 'C'),
('館', 'guan', 'G'), ('觀', 'guan', 'G'), ('條', 'tiao', 'T'), ('價', 'jia', 'J'),
('萊', 'lai', 'L'), ('壽', 'shou', 'S'), ('湯', 'tang', 'T'), ('濤', 'tao', 'T'),
('燒', 'shao', 'S'), ('藝', 'yi', 'Y'), ('齊', 'qi', 'Q'), ('齋', 'zhai', 'Z'),
-- ==================== 常见多音字(按常用读音) ====================
('行', 'xing', 'X'), -- 行走(xíng),银行(háng)
('长', 'zhang', 'Z'), -- 长度(cháng),队长(zhǎng)
('着', 'zhe', 'Z'), -- 穿着(zhuó),着急(zhāo)
('藏', 'cang', 'C'), -- 收藏(cáng),西藏(zàng)
('只', 'zhi', 'Z'), -- 只有(zhǐ),一只(zhī)
('重', 'zhong', 'Z'), -- 重量(zhòng),重复(chóng)
('朝', 'chao', 'C'), -- 朝代(cháo),朝向(zhāo)
('乐', 'le', 'L'), -- 快乐(lè),音乐(yuè)
('传', 'chuan', 'C'), -- 传递(chuán),传说(zhuàn)
('吓', 'xia', 'X'), -- 恐吓(xià),吓唬(hè)
('似', 'shi', 'S'), -- 相似(sì),似的(shì)
('笑', 'xiao', 'X'), -- 微笑(xiào),大笑(shào)
('还', 'huan', 'H'), -- 归还(huán),还有(hái)
('冠', 'guan', 'G'), -- 冠军(guàn),冠心病(guān)
('挑', 'tiao', 'T'), -- 挑选(tiāo),挑战(tiǎo)
('数', 'shu', 'S'), -- 数学(shù),数目(shǔ)
('弹', 'dan', 'D'), -- 弹琴(tán),子弹(dàn)
('奇', 'qi', 'Q'), -- 奇怪(qí),奇数(jī)
('降', 'jiang', 'J'), -- 下降(jiàng),投降(xiáng)
('强', 'qiang', 'Q'), -- 强大(qiáng),倔强(jiàng)
('都', 'dou', 'D'), -- 都市(dū),都有(dōu)
('少', 'shao', 'S'), -- 很少(shǎo),少年(shào)
('沈', 'shen', 'S'), -- 沈阳(shěn),沈默(chén)
('难', 'nan', 'N'), -- 困难(nán),难过(nàn)
('量', 'liang', 'L'), -- 数量(liàng),测量(liáng)
('累', 'lei', 'L'), -- 疲累(lèi),积累(lěi)
('兴', 'xing', 'X'), -- 兴奋(xīng),高兴(xìng)
('蒙', 'meng', 'M'), -- 蒙骗(méng),蒙古(měng)
('曾', 'zeng', 'Z'), -- 曾经(céng),曾姓(zēng)
('禁', 'jin', 'J'), -- 禁止(jìn),监禁(jīn)
('空', 'kong', 'K'), -- 空气(kōng),天空(kōng)
('模', 'mo', 'M'), -- 模型(mó),模仿(mó)
('宁', 'ning', 'N'), -- 宁静(níng),宁波(níng)
('调', 'diao', 'D'), -- 调整(tiáo),调查(diào)
('和', 'he', 'H'), -- 和平(hé),和面(huó)
-- ==================== 特殊姓氏 ====================
-- 多音字姓氏(按姓氏读音)
('仇', 'qiu', 'Q'), -- 仇姓,读qiú
('单', 'shan', 'S'), -- 单姓,读shàn
('解', 'xie', 'X'), -- 解姓,读xiè
('朴', 'piao', 'P'), -- 朝鲜姓氏,读piáo
('任', 'ren', 'R'), -- 任姓,读rén
('樊', 'fan', 'F'), -- 樊姓
('沈', 'shen', 'S'), -- 沈姓,读shěn
('盖', 'ge', 'G'), -- 盖姓,读gě
('乐', 'yue', 'Y'), -- 乐姓,读yuè
('查', 'zha', 'Z'), -- 查姓,读zhā
('曾', 'zeng', 'Z'), -- 曾姓,读zēng
('华', 'hua', 'H'), -- 华姓,读huà
('区', 'ou', 'O'), -- 区姓,读ōu
('秘', 'bi', 'B'), -- 秘姓,读bì
('贾', 'jia', 'J'), -- 贾姓,读jiǎ
('柏', 'bai', 'B'), -- 柏姓,读bǎi
('薄', 'bo', 'B'), -- 薄姓,读bó
('卜', 'bu', 'B'), -- 卜姓,读bǔ
('翟', 'zhai', 'Z'), -- 翟姓,读zhái
('么', 'yao', 'Y'), -- 么姓,读yāo
('宓', 'fu', 'F'), -- 宓姓,读fú
('折', 'she', 'S'), -- 折姓,读shē
('黑', 'he', 'H'), -- 黑姓,读hē
('訾', 'zi', 'Z'), -- 訾姓,读zī
('隗', 'wei', 'W'), -- 隗姓,读wěi
('臧', 'zang', 'Z'), -- 臧姓,读zāng
('缪', 'mou', 'M'), -- 缪姓,读móu
('於', 'yu', 'Y'), -- 於姓,读yú
('佴', 'nai', 'N'), -- 佴姓,读nài
('芮', 'rui', 'R'), -- 芮姓,读ruì
('鄢', 'yan', 'Y'), -- 鄢姓,读yān
('桓', 'huan', 'H'), -- 桓姓,读huán
('虞', 'yu', 'Y'), -- 虞姓,读yú
('牟', 'mou', 'M'), -- 牟姓,读móu
('郗', 'xi', 'X'), -- 郗姓,读xī
('尉', 'wei', 'W'), -- 尉姓,读wèi
('迮', 'ze', 'Z'), -- 迮姓,读zé
('雍', 'yong', 'Y'), -- 雍姓,读yōng
('班', 'ban', 'B'), -- 班姓
('冼', 'xian', 'X'), -- 冼姓,读xiǎn
('员', 'yun', 'Y'), -- 员姓,读yùn
('莘', 'shen', 'S'), -- 莘姓,读shēn
('阎', 'yan', 'Y'), -- 阎姓,读yán
('洗', 'xi', 'X'), -- 洗姓,读xǐ
-- ==================== 生僻字/特殊字 ====================
('窦', 'dou', 'D'), ('铖', 'cheng', 'C'), ('震', 'zhen', 'Z'),
('喆', 'zhe', 'Z'), ('卻', 'que', 'Q'), ('璟', 'jing', 'J'),
('妫', 'gui', 'G'), ('佘', 'she', 'S'), ('聂', 'nie', 'N'),
('鬱', 'yu', 'Y'), ('鑫', 'xin', 'X'), ('靓', 'jing', 'J'),
('霓', 'ni', 'N'), ('珺', 'jun', 'J'), ('琬', 'wan', 'W'),
('媛', 'yuan', 'Y'), ('琰', 'yan', 'Y'), ('玥', 'yue', 'Y'),
('俪', 'li', 'L'), ('隽', 'juan', 'J'), ('妍', 'yan', 'Y'),
('婕', 'jie', 'J'), ('珏', 'jue', 'J'), ('铭', 'ming', 'M'),
('岚', 'lan', 'L'), ('茜', 'qian', 'Q'), ('宸', 'chen', 'C'),
('珂', 'ke', 'K'), ('濮', 'pu', 'P'), ('镇', 'zhen', 'Z'),
('枫', 'feng', 'F'), ('缨', 'ying', 'Y'), ('茗', 'ming', 'M'),
('栩', 'xu', 'X'), ('淼', 'miao', 'M'), ('焱', 'yan', 'Y'),
('晔', 'ye', 'Y'), ('犇', 'ben', 'B'), ('骐', 'qi', 'Q'),
('榕', 'rong', 'R'), ('亦', 'yi', 'Y'), ('骏', 'jun', 'J'),
('骥', 'ji', 'J'), ('彧', 'yu', 'Y'), ('炜', 'wei', 'W'),
('煜', 'yu', 'Y'), ('槿', 'jin', 'J'), ('茹', 'ru', 'R'),
('淇', 'qi', 'Q'), ('苒', 'ran', 'R'), ('瑾', 'jin', 'J'),
('沁', 'qin', 'Q'), ('昕', 'xin', 'X'), ('玮', 'wei', 'W'),
('琳', 'lin', 'L'), ('琪', 'qi', 'Q'), ('琦', 'qi', 'Q'),
('琴', 'qin', 'Q'), ('瑶', 'yao', 'Y'), ('瑷', 'ai', 'A'),
('璐', 'lu', 'L'), ('璇', 'xuan', 'X'), ('曦', 'xi', 'X'),
('熠', 'yi', 'Y'), ('颢', 'hao', 'H'), ('颖', 'ying', 'Y'),
('颜', 'yan', 'Y'), ('魁', 'kui', 'K'), ('鹂', 'li', 'L'),
('鹃', 'juan', 'J'), ('鹏', 'peng', 'P'), ('鹤', 'he', 'H'),
('鹭', 'lu', 'L'), ('鹰', 'ying', 'Y'), ('黛', 'dai', 'D'),
('琛', 'chen', 'C'), ('琮', 'cong', 'C'), ('琨', 'kun', 'K'),
('琬', 'wan', 'W'), ('琥', 'hu', 'H'), ('琰', 'yan', 'Y'),
('琸', 'min', 'M'), ('瑀', 'yu', 'Y'), ('瑁', 'mao', 'M'),
('瑕', 'xia', 'X'), ('瑗', 'yuan', 'Y'), ('瑜', 'yu', 'Y'),
('瑭', 'tang', 'T'), ('璎', 'ying', 'Y'), ('璧', 'bi', 'B'),
('璐', 'lu', 'L'), ('璨', 'can', 'C'), ('璩', 'qu', 'Q'),
('璞', 'pu', 'P'), ('璟', 'jing', 'J'), ('璠', 'fan', 'F'),
('璜', 'huang', 'H'), ('璧', 'bi', 'B'), ('韵', 'yun', 'Y'),
('韶', 'shao', 'S'), ('韫', 'yun', 'Y'), ('韬', 'tao', 'T'),
('杰', 'jie', 'J'), ('奕', 'yi', 'Y'), ('飞', 'fei', 'F'),
('飙', 'biao', 'B'), ('飚', 'biao', 'B'), ('箭', 'jian', 'J'),
('翊', 'yi', 'Y'), ('翔', 'xiang', 'X'), ('翡', 'fei', 'F'),
('翠', 'cui', 'C'), ('翰', 'han', 'H'), ('翱', 'ao', 'A'),
('翮', 'he', 'H'), ('耘', 'yun', 'Y'), ('耕', 'geng', 'G'),
('耙', 'pa', 'P'), ('耗', 'hao', 'H'), ('耜', 'si', 'S')
-- 这里可以继续添加更多字符...
ON DUPLICATE KEY UPDATE `pinyin` = VALUES(`pinyin`), `first_letter` = VALUES(`first_letter`);
-- 获取中文对应的首字母,英语、数字则返回原值
DROP FUNCTION IF EXISTS `getFristPinyin`;
CREATE FUNCTION `getFristPinyin`(P_NAME VARCHAR(255)) RETURNS varchar(255)
DETERMINISTIC
BEGIN
DECLARE first_char VARCHAR(1);
DECLARE V_RETURN VARCHAR(255);
DECLARE gbk_code INT;
-- 如果输入为空,直接返回空
IF P_NAME IS NULL OR TRIM(P_NAME) = '' THEN
RETURN '';
END IF;
-- 获取首字符
SET first_char = LEFT(TRIM(P_NAME), 1);
-- 对于ASCII字符直接返回大写形式
IF first_char REGEXP '[a-zA-Z0-9]' THEN
RETURN UPPER(first_char);
END IF;
-- 优先查询表,解决多音字的情况
SELECT first_letter INTO V_RETURN
FROM `chinese_char_pinyin`
WHERE `char` = first_char LIMIT 1;
IF V_RETURN IS NULL THEN
-- GBK转换(大多数汉字可以直接处理)
SET gbk_code = CONV(HEX(left(CONVERT(P_NAME USING gbk),1)),16,10);
SET V_RETURN = ELT(INTERVAL(gbk_code,
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');
-- 如果表中也没有,返回#
IF V_RETURN IS NULL THEN
RETURN '#';
END IF;
END IF;
RETURN V_RETURN;
END;
-- 获取字符串的首字母
DROP FUNCTION IF EXISTS `getPinyinFirst`;
CREATE FUNCTION `getPinyinFirst`(P_NAME VARCHAR(255), isFirstUpper tinyint(1)) RETURNS varchar(255)
DETERMINISTIC
BEGIN
DECLARE result VARCHAR(255) DEFAULT '';
DECLARE i INT DEFAULT 1;
DECLARE char_val VARCHAR(1);
DECLARE py_val VARCHAR(10);
DECLARE str_length INT;
-- 1. 防止NULL输入
IF P_NAME IS NULL THEN
RETURN '';
END IF;
SET str_length = CHAR_LENGTH(P_NAME);
-- 2. 空字符串检查
IF str_length = 0 THEN
RETURN '';
END IF;
-- 3. 逐字符处理,防止无限循环和越界访问
WHILE i <= str_length AND i <= 500 DO
-- 获取当前字符
SET char_val = SUBSTRING(P_NAME, i, 1);
-- 4. 根据字符类型分别处理
CASE
WHEN char_val REGEXP '[0-9]' THEN
-- 数字直接保留
SET py_val = char_val;
WHEN char_val REGEXP '[a-zA-Z]' THEN
-- 字母直接保留
SET py_val = char_val;
WHEN char_val IN (',', ',', '.', '。', ':', ':', ';', ';', '!', '!',
'?', '?', '(', ')', '(', ')', '[', ']', '{', '}',
'"', '"', ''', ''') THEN
-- 标点符号也替换为空串
SET py_val = '';
ELSE
-- 调用已有的getFristPinyin函数处理字符
SET py_val = getFristPinyin(char_val);
-- 确保不会返回空值
IF py_val IS NULL OR py_val = '' THEN
SET py_val = '#';
END IF;
END CASE;
-- 连接结果(注意使用IFNULL确保连接成功)
SET result = CONCAT(IFNULL(result, ''), IFNULL(py_val, '#'));
SET i = i + 1;
END WHILE;
-- 6. 结果检查与处理
IF result = '' THEN
-- 如果结果为空,返回原始输入(防止丢失信息)
RETURN P_NAME;
END IF;
-- 7. 大小写处理逻辑
IF isFirstUpper > 0 THEN
-- 首字母大写模式 - 但只处理字母
IF result REGEXP '^[a-zA-Z]' THEN
-- 是字母,首字母大写,其余小写
SET result = CONCAT(UPPER(LEFT(result, 1)), LOWER(SUBSTRING(result, 2)));
ELSE
-- 不是字母,全部小写
SET result = LOWER(result);
END IF;
ELSE
-- 全部小写模式
SET result = LOWER(result);
END IF;
RETURN result;
END;
-- 添加管理员的存储过程
DROP PROCEDURE IF EXISTS `add_admin_user`;
CREATE PROCEDURE `add_admin_user`(
IN adminTypeName varchar(20),
IN phone varchar(20),
IN idcard varchar(100),
IN pwd varchar(100),
IN orgType int,
IN orgId bigint,
IN useParent int
)
BEGIN
SELECT org_parent_id INTO @P_ORG_ID FROM t_org_tree WHERE org_id = orgId;
SELECT org_name INTO @ORG_NAME FROM t_org_tree WHERE org_id = orgId;
SELECT org_name INTO @P_ORG_NAME FROM t_org_tree WHERE org_id = @P_ORG_ID;
SELECT CONCAT(if(useParent = 1, CONCAT(@P_ORG_NAME, '-'), ''), @ORG_NAME, adminTypeName) INTO @nickname;
SELECT CONCAT(if(useParent = 1, @P_ORG_NAME, ''),, @ORG_NAME, adminTypeName) INTO @account_cn;
SELECT CONCAT(if(useParent = 1, @P_ORG_NAME, ''),, @ORG_NAME, adminTypeName) INTO @account_cn;
SELECT getPinyinFirst(@account_cn, 1) INTO @account;
insert into `sys_authz_user`(`nickname`,`phone`,`id_type`,`idcard`) values(@nickname, phone, 1, idcard);
SELECT @USERID := LAST_INSERT_ID();
insert into `sys_authz_account`(`account`,`password`,`user_id`,`type`) values(@account,pwd,@USERID,'password');
insert into `sys_authz_user_identity`(`user_id`,`identity_id`,`info_id`) values(@USERID,6,NULL);
INSERT INTO t_org_tree_user ( org_id, user_id, org_type )
SELECT
_id AS org_id,( SELECT @USERID ) user_id,( SELECT orgType ) org_type
FROM
(
SELECT
@r AS _id,
( SELECT @r := org_parent_id FROM t_org_tree WHERE org_id = _id ) AS org_parent_id
FROM
( SELECT @r := orgId ) vars,
t_org_tree h
WHERE
@r != 0
AND org_parent_id > 0
) AS a
LEFT JOIN ( SELECT * FROM t_org_tree_user WHERE user_id = @USERID AND org_type = orgType ) b ON a._id = b.org_id
WHERE
b.id IS NULL;
INSERT INTO `t_role_org_user`(`role_id`, `org_id`, `user_id`, `is_delete`) VALUES (1, orgId,@USERID , 0);
END;在MySQL 命令行执行的时候
1、执行:DELIMITER //
2、执行:原SQL //
3、DELIMITER ;
作者:杭州天音 创建时间:2025-06-11 09:37
最后编辑:杭州天音 更新时间:2025-08-20 19:36
最后编辑:杭州天音 更新时间:2025-08-20 19:36