拼音函数和添加管理存储过程

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