在 MySQL 中,schema 与 database 完全等价;CREATE SCHEMA 等同于 CREATE DATABASE,SHOW SCHEMAS 即 SHOW DATABASES,information_schema.tables.table_schema 存储的是数据库名,MySQL 不支持库内多 schema、schema 授权或默认 schema 等概念。

MySQL 里 schema 就是 DATABASE
直接说结论:在 MySQL 中,schema 和 database 完全等价,没有逻辑隔离、命名空间或权限绑定那一套。你执行 CREATE SCHEMA myapp,和执行 CREATE DATABASE myapp 效果一模一样;SHOW SCHEMAS 就等于 SHOW DATABASES。
这不是“约定俗成”,而是官方定义:MySQL 8.0 官方术语表 明确写:“A schema is a database.”
-
information_schema.tables.table_schema字段存的就是数据库名(不是“模式名”) - 你无法在一个
DATABASE内创建多个schema—— MySQL 没这个能力 - 所谓“默认 schema”其实是“当前选中的 database”,靠
USE mydb切换,不是用户属性
为什么看其他数据库资料会越看越糊涂?
因为 Oracle、PostgreSQL、SQL Server 都把 schema 当作数据库内的**子命名空间**(类似文件夹),而 MySQL 偏偏没这层设计。你查到的“schema 是用户拥有的命名空间”“search_path 控制解析顺序”“授权到 schema”……这些在 MySQL 里统统不适用。
典型混淆点:
- 看到 PostgreSQL 的
CREATE SCHEMA myschema AUTHORIZATION myrole,就以为 MySQL 也能指定 owner —— 实际上 MySQL 的CREATE SCHEMA不支持AUTHORIZATION子句,加了会报错ERROR 1064 - 看到 Oracle 说 “user = schema”,就去查 MySQL 用户是否有默认 schema —— MySQL 用户根本没有
default_schema属性(mysql.user表里没有这列) - 用工具导出 SQL 时选了 “include schema”,结果生成一堆
CREATE SCHEMA IF NOT EXISTS xxx—— 没问题,但纯属冗余,删掉改DATABASE更直白
建库建表时怎么写才不踩坑?
日常开发中,建议统一用 DATABASE 术语,避免无谓歧义。尤其注意这几个实操细节:
- 创建库优先用
CREATE DATABASE myapp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,比CREATE SCHEMA更常见、更易读 - 跨库查询必须显式写库名前缀,例如
SELECT * FROM myapp.users;不写myapp.就只在当前USE的库下找表 - 备份时用
mysqldump myapp,不是mysqldump --schema=myapp(后者是无效参数) - 权限授权对象是
DATABASE级,例如GRANT SELECT ON myapp.* TO 'appuser'@'%',不存在 “GRANT … ON myapp.schema_name.*” 这种写法
CREATE DATABASE blog_app CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE blog_app; CREATE TABLE posts ( id INT PRIMARY KEY AUTO_INCREMENT, title VARCHAR(255) NOT NULL, content TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
真正需要关心的其实是 information_schema
虽然 MySQL 没有多 schema 架构,但系统库 information_schema 是你理解“结构”的关键入口——它不是普通数据库,而是一个只读的元数据视图。
比如查某张表结构:
SELECT column_name, data_type, is_nullable, column_default FROM information_schema.columns WHERE table_schema = 'blog_app' AND table_name = 'posts' ORDER BY ordinal_position;
注意:table_schema 这里填的是数据库名,不是“模式名”。别被字段名带偏。
容易忽略的一点:MySQL 8.0+ 默认启用 information_schema_stats_expiry 缓存统计信息,可能导致 COLUMNS 或 TABLES 视图短暂滞后。如果刚建完表却查不到,试试 ANALYZE TABLE posts 或临时设 SET SESSION information_schema_stats_expiry = 0。










