用 DATABASE() 获取当前数据库名,未选库时返回 NULL;PostgreSQL 用 current_database(),不会为 NULL;USER_DATABASE() 不存在,勿混淆。

MySQL里怎么拿到当前数据库名
用 DATABASE() 函数最直接,它返回当前 session 正在使用的数据库名,没选库时返回 NULL。注意别和 SCHEMA() 混——在 MySQL 里这两个函数完全等价,但 DATABASE() 更常见、更直白。
常见错误是误用 USER_DATABASE(压根不存在),或者以为 USER() 能返回库名——它只返回「用户@主机」字符串。
-
DATABASE()是会话级的,USE db_name切换后立刻变 - 如果程序连接后没显式
USE,调用DATABASE()返回空,不是报错 - 视图或存储过程里用它,取的是调用者 session 的当前库,不是定义者的
PostgreSQL里获取当前数据库名要换写法
PostgreSQL 没 DATABASE(),得用 current_database()。它始终返回当前连接的数据库名,不会是 NULL —— 因为 PG 连接必须指定数据库,没“未选库”状态。
别试 USER_DATABASE 或 USER(),PG 里它们都不提供库名。另外 current_schema() 返回的是搜索路径里的第一个 schema 名(比如 public),不是数据库名,容易混淆。
-
current_database()返回的是text类型,不是字符串字面量,别漏了类型转换场景 - 在跨库查询(如通过
dblink)中,它仍返回本地连接的库名,不是远端库 - 函数内联执行时行为稳定,不依赖 session 设置
USER() 和 CURRENT_USER() 在各数据库中的差异
USER() 返回客户端声明的用户名+主机(如 'appuser@10.0.1.5'),而 CURRENT_USER() 返回实际生效的授权主体(如 'appuser'@'%' 或某个 role)。两者在权限映射复杂时可能不同。
MySQL 和 PostgreSQL 都支持这两个函数,但语义一致;SQL Server 用 SYSTEM_USER 和 CURRENT_USER,Oracle 用 USER(注意没括号)和 SYS_CONTEXT('USERENV', 'CURRENT_USER') —— 不要硬套名字。
- 权限委托或代理用户场景下,
USER()和CURRENT_USER()值很可能不一致 -
USER()可能含 IP 或 host name,不适合直接拼进 SQL 字符串,有注入风险 - 日志或审计里建议优先记录
CURRENT_USER(),它反映真实权限上下文
为什么没有 USER_DATABASE() 这个函数
因为标准 SQL 没定义这个函数,主流数据库也没实现它。设计上,「用户」和「数据库」是两个正交概念:一个用户可访问多个库,一个库可被多个用户访问。强行绑定成一个函数反而模糊职责。
如果你看到别人代码里写了 USER_DATABASE(),基本是自定义函数或拼写错误——检查是不是 USER() 或 DATABASE() 少了个括号,或者误把应用层变量当 SQL 函数用了。
- MySQL 8.0+ 支持函数重载,但官方仍没加
USER_DATABASE() - 某些 ORM 或中间件会模拟这个行为,但它不在 SQL 层,不能直接在原生查询里用
- 真要组合用户+库信息,老实用
CONCAT(USER(), '@', DATABASE()),别找不存在的函数
USER 就以为能带出库名——它从来不管库的事。










