mysql中“模式”即数据库,二者完全等价;执行create database或create schema效果相同;show databases列出所有模式,use切换当前会话默认数据库,select database()查看当前模式名。

MySQL里“模式”就是数据库本身
在MySQL中,schema 和 database 是同义词,不是两个层级的概念。执行 CREATE DATABASE myapp; 或 CREATE SCHEMA myapp;,效果完全一样——都会新建一个名为 myapp 的逻辑容器,它就是你后续建表、设视图、加存储过程的全部作用域。
这和 postgresql、SQL Server 等数据库不同:它们的 schema 是数据库内的命名空间(比如 public、sales),一个数据库可含多个 schema;而 MySQL 的 schema 就是数据库,没有嵌套结构。
怎么确认当前用的是哪个“模式”
MySQL 不提供独立的 SHOW SCHEMAS; 命令(虽然语法合法,但实际等价于 SHOW DATABASES;)。真正有效的操作链是:
-
SHOW DATABASES;—— 列出所有模式(即所有数据库) -
USE mydb;—— “进入”该模式,后续操作默认在此上下文中进行 -
SELECT DATABASE();—— 查看当前正在使用的模式名(返回mydb或NULL,后者表示未选库)
注意:USE 不是“切换模式”,而是设置会话默认数据库;它不影响其他连接,也不改变元数据。
查看模式结构时,别只靠 DESCRIBE
DESCRIBE table_name; 只显示字段名、类型、是否为空、键类型等基础列定义,**不包含约束细节、索引、外键引用、字符集或存储引擎信息**——这些恰恰是模式定义的关键部分。
真正反映完整模式的命令是:
-
SHOW CREATE TABLE table_name;—— 输出可复用的建表语句,含ENGINE=InnoDB、CHARSET=utf8mb4、FOREIGN KEY定义等 - 查
INFORMATION_SCHEMA:比如SELECT COLUMN_NAME, DATA_TYPE, COLUMN_DEFAULT, EXTRA FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'mydb' AND TABLE_NAME = 'users';
导出结构用于迁移或审计时,务必用 mysqldump -u user -p --no-data mydb > schema.sql,而不是手工拼 CREATE TABLE 语句——外键顺序、索引名称、自增起始值等细节极易遗漏。
为什么有人误以为“模式 ≠ 数据库”
这种混淆主要来自三处:
- SQL 标准文档中把
schema定义为“命名空间”,MySQL 实现时做了简化映射 - 某些 ORM 框架(如 django)配置里写
SCHEMA,实际仍指向 MySQL 的 database 名 - dba 在跨数据库迁移时,习惯性沿用 PostgreSQL 思维,试图在 MySQL 里建
CREATE SCHEMA sales;再建CREATE SCHEMA reporting;到同一个实例——可行,但它们仍是平级的两个数据库,彼此隔离,不能通过sales.users和reporting.users自动关联
真正需要逻辑隔离时,MySQL 的做法是:用不同 database + 显式跨库查询(如 SELECT * FROM db1.users JOIN db2.logs ON ...),而非依赖 schema 嵌套。