
怎么查 MySQL 里所有已创建的函数
直接查 information_schema.ROUTINES 表最可靠,SHOW FUNCTION STATUS 虽快但权限要求高、且不返回函数体。
常见错误是只用 SHOW CREATE FUNCTION func_name —— 这必须知道函数名才能查,没法枚举全部。
SELECT ROUTINE_NAME, ROUTINE_DEFINITION FROM information_schema.ROUTINES WHERE ROUTINE_SCHEMA = 'your_db' AND ROUTINE_TYPE = 'FUNCTION'- 注意
ROUTINE_DEFINITION在某些配置下可能为NULL(比如开启了log_bin_trust_function_creators=OFF且函数未被标记为DETERMINISTIC) - 如果只想要函数名列表,去掉
ROUTINE_DEFINITION即可,避免大字段拖慢查询
如何查看某个函数的具体定义(含参数和逻辑)
SHOW CREATE FUNCTION 是唯一能拿到完整 CREATE FUNCTION 语句的方式,包括参数类型、返回值、特性声明(如 DETERMINISTIC)和函数体。
容易踩的坑:函数名必须严格匹配大小写(取决于系统变量 lower_case_table_names),且不能加数据库前缀——SHOW CREATE FUNCTION mydb.myfunc 会报错,得先 USE mydb 或用 myfunc 单独写。
- 执行前确认当前用户有
SELECT权限在mysql.proc(旧版)或information_schema.ROUTINES(新版),否则提示Access denied - 若返回
NULL在Create Function列,大概率是函数定义被隐藏了(常见于二进制日志安全限制) - 示例:
SHOW CREATE FUNCTION calc_tax→ 返回一行,第二列就是完整的创建语句
触发器怎么列出来,和函数查法一样吗
不一样。触发器不存于 ROUTINES,得查 information_schema.TRIGGERS,而且 SHOW TRIGGERS 更常用、更直观。
SHOW TRIGGERS 默认只显示当前库的触发器,加 FROM other_db 可切换;但它不返回触发器逻辑,要定义得用 SHOW CREATE TRIGGER。
-
SHOW TRIGGERS LIKE 'order_%'支持简单模糊匹配,比查表方便 -
SELECT TRIGGER_NAME, EVENT_MANIPULATION, EVENT_OBJECT_TABLE FROM information_schema.TRIGGERS WHERE TRIGGER_SCHEMA = 'your_db'更适合脚本化处理 - 触发器没有“跨库调用”概念,所以
TRIGGER_SCHEMA永远等于它所属的数据库名,别指望从其他库查到
为什么 SHOW CREATE FUNCTION 有时报错 Unknown function
不是函数不存在,而是当前用户没权限读取函数元数据,或者函数根本不在当前默认库中。
典型错误信息是:ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled —— 这其实是创建时的限制,但会影响后续 SHOW CREATE 的可见性。
- 检查是否执行过
SELECT * FROM mysql.proc WHERE name = 'func_name'(需PROCESS权限) - 确认函数确实在当前连接的默认数据库里,否则显式指定:
SHOW CREATE FUNCTION your_db.func_name(注意:这个语法仅在 MySQL 8.0.23+ 支持) - 低版本 MySQL 中,跨库查函数定义只能先
USE your_db,再执行SHOW CREATE FUNCTION
函数体是否可见、触发器能否跨库查、权限和版本对命令行为的影响——这些细节不试一次根本意识不到。










