如何查看MySQL数据库中的所有自定义函数

作者:袖梨 2026-08-28

SHOW FUNCTION STATUS仅显示当前USE切换的数据库中的自定义函数,结果含函数名、类型、创建者、时间等元数据,但不包含函数体;需先USE目标库,否则返回空。

show function status 能查到什么

直接执行 SHOW FUNCTION STATUS,它只列出当前默认数据库(即你 USE db_name 切换进去的那个库)里的自定义函数,不跨库。结果包含函数名、类型、创建者、修改时间、安全特性等,但不显示函数体或 SQL 定义。

常见误操作:没先 USE your_db 就运行,结果返回空——因为默认在 information_schemamysql 系统库下,而这些库没有你的自定义函数。

  1. 想查特定库的函数,必须先 USE your_database_name
  2. LIKE 'pattern' 可模糊过滤,比如 SHOW FUNCTION STATUS LIKE 'get_%'
  3. 该命令不依赖权限检查,只要能连上且有对应库的 SELECT 权限即可执行

用 INFORMATION_SCHEMA.ROUTINES 查全量函数

这是最可靠的方式,能跨库查询,且返回函数定义原文。关键点在于 WHERE 条件要写对:

SELECT ROUTINE_NAME, ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA = 'your_database_name' AND ROUTINE_TYPE = 'FUNCTION';

注意:ROUTINE_SCHEMA 是数据库名,不是表名;ROUTINE_DEFINITION 字段在 MySQL 8.0+ 默认可见,但若函数是用 DEFINER 创建且当前用户无 SUPER 权限,可能显示为 NULL

  1. 想查所有库的自定义函数?把 ROUTINE_SCHEMA = 'xxx' 换成 ROUTINE_SCHEMA NOT IN ('mysql', 'information_schema', 'performance_schema', 'sys')
  2. 如果只关心函数名和参数,可加 ROUTINE_COMMENTDTD_IDENTIFIER(返回值类型)字段
  3. 该查询需有 SELECT 权限,且对 INFORMATION_SCHEMA 表可访问

show create function 函数名 显示不全怎么办

SHOW CREATE FUNCTION func_name 是查看单个函数完整定义(含 DELIMITERREADS SQL DATA 等特性)的权威方式。但它有几个硬性前提:

  1. 函数必须存在于当前默认数据库中(否则报错 ERROR 1418FUNCTION does not exist
  2. 当前用户必须对该函数有 EXECUTE 权限(MySQL 5.7+ 默认授予创建者,但其他用户需显式授权)
  3. 若函数定义过长(如含大段注释或复杂逻辑),ROUTINE_DEFINITIONINFORMATION_SCHEMA 中可能被截断,但 SHOW CREATE FUNCTION 不会

典型报错:ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration... —— 这说明函数创建时没声明特性,但不影响查看,只是提示风险。

为什么 select from mysql.proc 查不到用户函数

老教程常提 SELECT name FROM mysql.proc WHERE db='your_db' AND type='FUNCTION',但这个方式在 MySQL 8.0+ 已失效:系统表 mysql.proc 被弃用,不再同步维护用户函数元数据。强行查只会返回空或旧残留记录。

如果你在 MySQL 8.0+ 上看到结果为空,不是权限或语法问题,而是底层机制变了。必须改用 INFORMATION_SCHEMA.ROUTINESSHOW FUNCTION STATUS

另外,mysql.proc 表本身需要 SELECT 权限,且普通用户默认无权访问——这也是一个容易卡住的权限盲点。

相关文章

精彩推荐