MySQL自定义函数是用户编写的、用于扩展原生能力的确定性SQL逻辑,需用DELIMITER修改分隔符,CREATE FUNCTION定义,含参数、返回类型及BEGIN…END函数体,调用如内置函数。

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;










