MySQL中查当前数据库名应使用SELECT DATABASE();,它返回当前会话选定的数据库名,未选库时为NULL;PostgreSQL用SELECT current_database();,SQL Server用SELECT DB_NAME();三者语法互不兼容。

SQL中怎么查当前数据库名——别用DATABASE()函数
直接说结论:DATABASE() 函数在 MySQL 中确实存在,但只在部分版本(5.7+)默认启用,且必须确保没有显式切换过数据库(比如没执行过 USE db_name 后又断开重连),否则可能返回 NULL。更稳妥、跨版本兼容的方式是查系统变量。
MySQL里查当前数据库的可靠方法
推荐用 SELECT DATABASE(); ——注意这不是函数调用语法糖,而是 MySQL 特殊的“无参函数”写法,它会返回当前 session 所选中的数据库名;如果还没选库,结果就是 NULL。
常见错误现象:
- 执行
SELECT DATABASE();返回NULL:说明当前连接没执行过USE xxx,或刚连上还没选库 - 执行
SELECT DATABASE();在存储过程中返回空:可能是过程内临时切换了库但没生效,或用了PREPARE/EXECUTE导致上下文丢失
实操建议:
- 连接后第一件事就跑
SELECT DATABASE();确认上下文 - 在脚本开头加判断:
SELECT IFNULL(DATABASE(), 'no_database_selected') AS current_db; - 不要依赖
SCHEMA()(它和DATABASE()行为一致,但可读性差,不推荐)
PostgreSQL 和 SQL Server 怎么办
不同数据库语法完全不同,DATABASE() 在 PostgreSQL 和 SQL Server 中根本不存在。
PostgreSQL 用:SELECT current_database();
SQL Server 用:SELECT DB_NAME();
注意点:
- PostgreSQL 的
current_database()永远返回非空字符串,即使在 template1 或未指定 default db 的连接中也会有值 - SQL Server 的
DB_NAME()若传参(如DB_NAME(2))可查指定 ID 的库名,不传参才查当前 - 三者都不支持在视图定义里直接嵌套这类函数(会报错或被静态化),需改用会话级变量替代
为什么不能只信 INFORMATION_SCHEMA.SCHEMATA
INFORMATION_SCHEMA.SCHEMATA 是所有数据库的元数据列表,不是当前上下文快照。有人误写 SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA LIMIT 1 来“猜”当前库,这是错的。
真正容易被忽略的点:
- 一个连接可以不绑定任何数据库(尤其连接池初始化时),此时
DATABASE()和current_database()都合法返回空或默认库,但业务逻辑若假设“一定有库”,就会出静默错误 - 某些 ORM(如 Django 的 raw SQL)会在执行前自动加
SET search_path或USE,导致你本地测试时有值,上线后因连接复用而行为不一致 - MySQL 8.0+ 开启
sql_require_primary_key等严格模式时,DATABASE()调用本身不受影响,但后续建表失败可能让你误以为是库名获取错了


















