MySQL触发器实现姓名各单词首字母大写的方法
嘿,这个需求其实很好实现!不过MySQL本身没有直接支持「每个单词首字母大写」的内置函数,所以我们得先搞个自定义函数,再搭配触发器搞定插入和更新时的自动格式化。
解决方案
步骤1:创建自定义函数实现单词首字母大写
先写一个函数,专门处理字符串的单词首字母大写(支持空格分隔的多单词):
DELIMITER // CREATE FUNCTION INITCAP(str VARCHAR(255)) RETURNS VARCHAR(255) DETERMINISTIC BEGIN DECLARE result VARCHAR(255); DECLARE word VARCHAR(255); DECLARE pos INT; -- 先把整个字符串转成小写,避免原字符串大小写混乱 SET str = LOWER(str); SET result = ''; SET pos = LOCATE(' ', str); -- 循环拆分并处理每个空格分隔的单词 WHILE pos > 0 DO SET word = CONCAT(UPPER(SUBSTRING(str, 1, 1)), SUBSTRING(str, 2, pos - 1)); SET result = CONCAT(result, word, ' '); SET str = SUBSTRING(str, pos + 1); SET pos = LOCATE(' ', str); END WHILE; -- 处理最后一个没有空格结尾的单词 SET word = CONCAT(UPPER(SUBSTRING(str, 1, 1)), SUBSTRING(str, 2)); SET result = CONCAT(result, word); RETURN result; END // DELIMITER ;
步骤2:创建INSERT触发器
在插入数据前自动格式化姓名字段:
DELIMITER // CREATE TRIGGER trg_people_before_insert BEFORE INSERT ON people FOR EACH ROW BEGIN SET NEW.Firstname = INITCAP(NEW.Firstname); SET NEW.Lastname = INITCAP(NEW.Lastname); END // DELIMITER ;
步骤3:创建UPDATE触发器
在更新数据时同样自动格式化姓名字段:
DELIMITER // CREATE TRIGGER trg_people_before_update BEFORE UPDATE ON people FOR EACH ROW BEGIN SET NEW.Firstname = INITCAP(NEW.Firstname); SET NEW.Lastname = INITCAP(NEW.Lastname); END // DELIMITER ;
测试验证
现在试试效果:
- 执行插入语句:
INSERT INTO people (Firstname, Lastname) VALUES ('doe', 'john');
插入后表中会得到Firstname='Doe'、Lastname='John'。
- 执行更新语句:
UPDATE people SET Lastname = 'smith', Firstname= 'jane' WHERE Id_People = 1;
更新后对应的字段会变成Firstname='Jane'、Lastname='Smith'。
- 测试多单词姓名:
INSERT INTO people (Firstname, Lastname) VALUES ('john paul', 'smith jones');
插入后会得到Firstname='John Paul'、Lastname='Smith Jones',完美处理多单词的首字母大写。
内容的提问来源于stack exchange,提问作者Finalmix6
相关产品推荐
相关产品推荐

