在MySQL数据库管理工作中,经常需要查询特定数据库下定义的存储函数,用于代码调试、数据库对象梳理或者权限审计等场景,直接获取目标结果可以避免无关信息的干扰。

方法一:查询 information_schema 系统库
MySQL的information_schema库是存储所有数据库元数据的信息库,其中的ROUTINES表专门记录了所有存储过程和存储函数的信息,我们可以通过筛选ROUTINE_SCHEMA字段来指定目标数据库,同时ROUTINE_TYPE字段可以区分存储函数和存储过程。
以下是查询特定数据库存储函数的SQL示例,假设我们要查询的数据库名为test_db:
-- 查询test_db数据库中所有的存储函数
SELECT
ROUTINE_NAME AS 函数名称,
ROUTINE_DEFINITION AS 函数定义,
CREATED AS 创建时间,
LAST_ALTERED AS 最后修改时间
FROM information_schema.ROUTINES
WHERE ROUTINE_SCHEMA = 'test_db'
AND ROUTINE_TYPE = 'FUNCTION';
该方法的优势是可以灵活选择返回的字段,除了函数名称之外,还能获取函数的定义内容、创建时间等额外信息,适合需要详细元数据的场景。
方法二:使用 SHOW FUNCTION STATUS 语句
MySQL提供了SHOW FUNCTION STATUS语句用于展示存储函数的状态信息,我们可以通过WHERE子句或者LIKE关键字来筛选特定数据库的函数。
方式1:使用 LIKE 筛选数据库名
SHOW FUNCTION STATUS的LIKE后面的匹配规则是匹配函数名称,但是我们可以结合Db字段的显示来间接筛选,不过更方便的是直接在语句后面加WHERE条件:
-- 查看test_db数据库的所有存储函数 SHOW FUNCTION STATUS WHERE Db = 'test_db';
方式2:返回结果说明
该语句返回的字段包含以下信息:
- Db:函数所属的数据库名
- Name:存储函数的名称
- Type:对象类型,存储函数固定为
FUNCTION - Definer:函数的定义者
- Modified:函数最后修改时间
- Created:函数创建时间
- Security_type:安全检查类型,分为
DEFINER和INVOKER - Comment:函数的注释信息
这种方法语法更简洁,适合只需要快速查看函数名称和基本信息的场景。
两种方法的对比
我们可以通过以下表格对比两种方法的差异,方便选择适合自己场景的方式:
| 对比维度 | 查询 information_schema.ROUTINES | SHOW FUNCTION STATUS 语句 |
|---|---|---|
| 语法复杂度 | 较高,需要写完整的SELECT语句 | 较低,内置语句无需复杂拼接 |
| 可获取字段 | 可自定义选择返回字段,能获取函数定义内容 | 返回固定字段,无法获取函数完整定义 |
| 适用场景 | 需要详细元数据、函数定义时使用 | 快速查看函数列表、基本信息时使用 |
注意事项
在使用以上方法查询存储函数时,需要注意以下几点:
- 执行查询的用户需要有对应数据库的
SELECT权限,以及information_schema库的查询权限,否则可能返回空结果或者报错。如果是使用SHOW FUNCTION STATUS语句,需要有SHOW_ROUTINE权限或者对应数据库的SELECT权限。 - 如果查询的数据库不存在,两种方法都会返回空的结果集,不会直接报错,所以查询前可以先确认数据库是否存在。
- 存储函数和存储过程都存储在
ROUTINES表中,所以查询时一定要加上ROUTINE_TYPE = 'FUNCTION'的条件,避免把存储过程也查询出来。
常见问题解答
为什么查询结果为空?
可能的原因有三个:一是目标数据库中没有定义任何存储函数;二是当前登录的用户没有对应的查询权限;三是数据库名填写错误,注意数据库名区分大小写,需要和实际定义的名称完全一致。
可以查询其他数据库的存储函数吗?
只要有对应的权限,就可以查询任意数据库的存储函数,只需要把语句中的test_db替换成目标数据库的名称即可。
提示:如果需要查看存储函数的完整定义内容,除了查询information_schema.ROUTINES表的ROUTINE_DEFINITION字段之外,还可以使用SHOW CREATE FUNCTION 函数名语句,该语句会返回完整的函数创建语句。
MySQL存储函数information_schemaSHOW_FUNCTION_STATUS数据库查询修改时间:2026-06-30 11:36:31