MySQL 中 schema 与 database 完全等价,CREATE DATABASE 和 CREATE SCHEMA 效果相同;因未实现多 schema 架构,二者仅一层命名空间,使用时需团队统一术语并注意跨数据库迁移差异。

在 MySQL 中,schema 和 database 没有实质 区别,它们是完全等价的概念。MySQL 官方文档和实际语法都明确支持这种等同性:你用 CREATE DATABASE 创建的,就是 schema;用 CREATE SCHEMA 创建的,也是 database。
为什么 会有两个名字?
这是 SQL 标准与 MySQL 实现方式之间的适配结果:
- SQL 标准中,schema 是逻辑组织单位,用来归类表、视图、存储过程等对象
- database 更偏向物理容器或实例级命名空间的概念
- 但 MySQL 并未实现“一个 database 下多个 schema”的结构(像 Oracle 或 SQL Server 那样),而是直接把每个 database 当作一个独立的 schema 命名空间
实际使用中怎么选?
语法上两者可互换,但习惯和场景略有倾向:
- 写脚本、配置文件、运维命令时,多数人用
database—— 比如mysql -u root -p my_database - 图形化 工具(如 MySQL Workbench)、建模工具或强调标准兼容性的场合,更常用
schema - SQL 语句里:
CREATE DATABASE foo和CREATE SCHEMA foo效果一模一样 -
USE foo中的foo既可以叫 database,也可以叫 schema
和其他数据库对比,能更好理解
MySQL 的简化设计容易让人困惑,看看别的系统怎么做:
- Oracle:一个 database 实例下可有多个 schema(通常对应不同用户),schema 不等于 database
- SQL Server:schema 是 database 内部的二级命名空间(如
dbo.users、sales.orders) - PostgreSQL:类似 SQL Server,
public是默认 schema,可创建多个 - MySQL:没有这层分离,
database = schema,仅一层命名空间
要不要在代码或文档里区分?
没必要刻意区分,但要注意一致性:
- 团队内部统一用
database或统一用schema,避免混用造成理解偏差 - 对接其他数据库(比如从 Oracle 迁移过来)时,需意识到 MySQL 缺少多 schema 支持,权限模型也不同
- 如果未来可能迁移到 PostgreSQL 或 SQL Server,建模阶段就该预留 schema 层级意识