讲解

在 MySQL 里,数据库(DATABASE)和 SCHEMA 是同义词,可以理解为一组表的命名空间。一台服务器上通常有多个库:业务库按系统划分,另外还有四个系统库——mysql 存账号权限等系统数据、information_schema 是只读的元数据视图、performance_schema 和 sys 用于性能诊断。建库的语法很简单,但有一个必须养成的习惯:永远显式指定字符集,推荐 utf8mb4 配 utf8mb4_0900_ai_ci 排序规则,否则库的默认字符集会继承服务器设置,老系统上常常是 latin1,中文一存就乱码。

USE 命令切换当前默认库,之后的语句不用写库名前缀。DROP DATABASE 删除整个库——MySQL 没有回收站,这条命令是不可逆的,执行前多想三秒。查看有哪些库用 SHOW DATABASES,想看更详细的信息(字符集、表数量、占用空间)就查 information_schema:SCHEMATA 表列所有库、TABLES 表列所有表,它是 DBA 的「数据库里的数据库」。

判断一个库占多大空间、哪张表最大,也是查 information_schema.TABLES 的 DATA_LENGTH 和 INDEX_LENGTH 字段。日常巡检时这条查询非常实用,能快速定位膨胀的表。

示例

创建一个业务库并显式指定字符集,然后从 information_schema 确认它的属性:

CREATE DATABASE IF NOT EXISTS demo_shop CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;

SHOW DATABASES;

SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME
FROM information_schema.SCHEMATA
WHERE SCHEMA_NAME = 'demo_shop';

切进新库建张表,再查 information_schema 看表的元数据(引擎、行数估计、大小):

USE demo_shop;

CREATE TABLE products (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(100) NOT NULL,
  price DECIMAL(10,2) NOT NULL DEFAULT 0
);

INSERT INTO products (name, price) VALUES ('机械键盘', 299.00), ('无线鼠标', 99.00);

SHOW TABLES;

SELECT TABLE_NAME, ENGINE, TABLE_ROWS, DATA_LENGTH, INDEX_LENGTH
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'demo_shop';

删除整个库,并确认它从元数据里消失(生产环境执行 DROP DATABASE 前请再三确认):

DROP DATABASE IF EXISTS demo_shop;

SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = 'demo_shop';

常见坑

  • 建库不指定字符集:继承到的默认字符集可能是 latin1 或三字节 utf8,后面再改要逐库逐表逐列转换,非常痛苦。CREATE DATABASE 时一次写对。
  • 忘记 USE 切库:在错误的默认库里执行建表、删表,把表建到了别的系统里。脚本里所有对象名都带上库名前缀最稳妥。
  • 以为 DROP 能反悔:MySQL 没有回收站,DROP DATABASE 之后只能靠备份恢复。重要操作前先 mysqldump 一份。
  • 把业务表建进系统库:连接时不指定库、默认落在 mysql 库里,把业务表和系统表混在一起。连接串里永远指定默认库。

小结

CREATE DATABASE 记得指定 utf8mb4,USE 切换默认库,DROP 不可逆;information_schema 是查看库表元数据的入口。下一章讲建表时最重要的决策:列的数据类型怎么选。