在 MySQL 中,schema 与 database 完全等价;CREATE SCHEMA 等同于 CREATE DATABASE,SHOW SCHEMAS 即 SHOW DATABASES,information_schema.tables.table_schema 存储的是数据库名,MySQL 不支持库内多 schema、schema 授权或默认 schema 等概念。
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 没这个能力USE mydb 切换,不是用户属性因为 Oracle、PostgreSQL、SQL Server 都把 schema 当作数据库内的**子命名空间**(类似文件夹),而 MySQL 偏偏没这层设计。你查到的“schema 是用户拥有的命名空间”“search_path 控制解析顺序”“授权到 schema”……这些在 MySQL 里统统不适用。
典型混淆点:
CREATE SCHEMA myschema AUTHORIZATION myrole,就以为 MySQL 也能指定 owner —— 实际上 MySQL 的 CREATE SCHEMA 不支持 AUTHORIZATION 子句,加了会报错 ERROR 1064
default_schema 属性(mysql.user 表里没有这列)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。