MySQL 中的函数,是一段被封装好的、可重复调用的 SQL 逻辑,它的核心作用是**接收输入、执行计算或处理、返回一个确定值**。自定义函数(User-Defined Function, UDF)就是由用户自己编写、注册到数据库中的函数,用于扩展 MySQL 原生能力,比如拼接带格式的名称、生成动态表名、做业务规则判断等。
自定义函数的基本结构
一个合法的 MySQL 自定义函数必须包含以下要素:
DELIMITER 修改分隔符:因函数体中含多个;,需先用
DELIMITER $$临时改结束符,避免提前触发执行;函数定义完再用
DELIMITER ;恢复。 CREATE FUNCTION 语句:指定函数名、参数列表(形参+类型)、
RETURNS返回类型(注意不是
RETURN)。 BEGIN … END 函数体:中间可声明变量(
DECLARE)、赋值(
SET或
SELECT ... INTO)、流程控制(
IF/
CASE),最后必须有
RETURN 表达式。
创建前的关键准备
不是所有环境默认允许创建函数,需确认并开启权限:
检查是否启用:SHOW VARIABLES LIKE '%func%';,重点看
log_bin_trust_function_creators是否为
ON(值为
1)。 若未开启,需执行:
SET GLOBAL log_bin_trust_function_creators = 1;(需 SUPER 权限)。 函数不能包含非确定性操作(如
NOW()、
RAND()),除非显式声明
DETERMINISTIC或对应特性(如
READS SQL DATA)。
常见使用场景与写法要点
自定义函数适合轻量、单值、可预测的逻辑封装,例如:
字符串组合:如CONCAT(name, '(', code, ')'),配合 IFNULL或
TRIM处理空值。 数值转换或校验:如将分数转等级(90→'A')、身份证号校验位计算。 日期格式化封装:用
DATE_FORMAT(NOW(), '%Y年%m月%d日')封装成易读中文日期。 注意限制:不能执行
INSERT/
UPDATE/
DELETE,不能返回结果集,也不能动态执行 SQL(这点和存储过程不同)。
调用与管理方式
函数一旦创建成功,就可像内置函数一样直接在 SQL 中使用:
在SELECT中:
SELECT addMaterialName('钢板', 'Q235B');
在 WHERE或
ORDER BY中:
WHERE getAge(birth_date) > 18查看已创建函数:
SHOW FUNCTION STATUS;或查询
information_schema.ROUTINES删除函数:
DROP FUNCTION IF EXISTS function_name;
