select database() 返回当前选中的数据库名,未选库时返回 null;它是无参函数,括号不可省略;与 schema() 完全等价,推荐统一用 database();null 还可能由权限不足、c api 连接未指定库或角色无数据库权限导致。

怎么用 SELECT DATABASE() 查当前数据库名
直接执行 SELECT DATABASE(); 就能拿到当前选中的数据库名,返回结果是一行一列,值为字符串(比如 'myapp'),如果没选库则返回 NULL。
注意它不是函数调用语法(不加引号、不写括号里的参数),但括号是必需的——MySQL 把它定义为「无参函数」,漏掉括号会报错 ERROR 1064。
- 在连接刚建立、还没执行
USE xxx时,SELECT DATABASE()返回NULL,不是空字符串 - 存储过程或函数里也能用,但要注意:如果过程里切换过库(比如
USE other_db),它返回的是最新一次USE的库名 - 不能用在视图定义里(MySQL 8.0.28 之前会报错
ERROR 1351)
DATABASE() 和 SCHEMA() 有啥区别
完全等价。MySQL 中 SCHEMA() 是 DATABASE() 的同义函数,二者行为、返回值、兼容性一模一样。
官方文档明确写了它们互为别名,连源码里都指向同一个实现。所以选哪个纯看团队习惯,但建议统一用 DATABASE() —— 更直白,也避免别人误以为 SCHEMA() 能查模式相关信息(它不能)。
- 两者都不接受任何参数,写成
DATABASE('test')会报ERROR 1064 - 在严格 SQL 模式下仍可用,不属于被禁用的非标准函数
- 性能无差异,都是轻量级会话变量读取,不走磁盘、不锁表
为什么在某些场景下 SELECT DATABASE() 返回 NULL
除了刚连上没选库,还有两个常见原因导致返回 NULL:
- 用户权限不足:如果账号只有全局权限(如
PROCESS)但没任何数据库的USAGE权限,即使连上了也视为“未选定有效库” - 使用了
mysql_real_connect()并传入NULL作为数据库名(C API 场景),此时连接上下文里就没有默认库 - 在 MySQL 8.0+ 的角色(role)机制下,如果激活的角色没绑定任何数据库权限,也可能触发该现象
这时别急着怀疑函数坏了,先用 SHOW DATABASES; 确认你能看到哪些库,再检查账号权限是否包含对应库的 SELECT 或 USAGE。
替代方案:从 information_schema 查库名靠谱吗
不推荐。虽然可以写 SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = DATABASE(),但这绕远路,还多一次元数据表扫描。
information_schema 是只读视图,查它要加 MDL 锁、走统计信息、受 innodb_stats_on_metadata 影响,而 DATABASE() 是纯内存会话变量,快一个数量级。
- 在高并发短连接场景下,频繁查
information_schema可能引发元数据锁争用 -
information_schema.SCHEMATA不包含临时库、也不反映当前会话实际生效的库(比如你USE了一个不存在的库,DATABASE()返回NULL,但它可能还在SHEMATA里) - 真正需要“所有可用库名”时才查
information_schema,查当前库就别绕弯
函数本身很简单,但容易被权限、连接方式和角色配置悄悄影响结果——盯住 NULL 这个返回值,它通常不是 bug,而是会话状态的真实反馈。











