MySQL 库与表的操作实战指南
本文涵盖数据库和数据表的增删改查、字符集配置、备份恢复等核心操作,所有命令均可直接复制执行。
目录
- 第一部分:数据库(库)的操作
- [1. 创建数据库](#1. 创建数据库)
- [2. 字符集与校验规则](#2. 字符集与校验规则)
- [2.1 什么是字符集](#2.1 什么是字符集)
- [2.2 什么是校验规则](#2.2 什么是校验规则)
- [2.3 查看系统默认配置](#2.3 查看系统默认配置)
- [2.4 查看 MySQL 支持的所有字符集](#2.4 查看 MySQL 支持的所有字符集)
- [2.5 查看 MySQL 支持的所有校验规则](#2.5 查看 MySQL 支持的所有校验规则)
- [2.6 校验规则的实际影响(重点理解)](#2.6 校验规则的实际影响(重点理解))
- [3. 查看数据库](#3. 查看数据库)
- [4. 修改数据库](#4. 修改数据库)
- [5. 删除数据库](#5. 删除数据库)
- [6. 备份与恢复](#6. 备份与恢复)
- [6.1 备份整个数据库](#6.1 备份整个数据库)
- [6.2 备份指定的表](#6.2 备份指定的表)
- [6.3 同时备份多个数据库](#6.3 同时备份多个数据库)
- [6.4 恢复数据库](#6.4 恢复数据库)
- [7. 查看连接情况](#7. 查看连接情况)
- 第二部分:数据表(表)的操作
- [1. 创建数据表](#1. 创建数据表)
- [2. 查看表结构](#2. 查看表结构)
- [3. 修改表结构](#3. 修改表结构)
- [3.1 添加新字段](#3.1 添加新字段)
- [3.2 修改字段类型或长度](#3.2 修改字段类型或长度)
- [3.3 修改字段名称](#3.3 修改字段名称)
- [3.4 删除字段](#3.4 删除字段)
- [3.5 修改表名](#3.5 修改表名)
- [3.6 修改字段操作对比](#3.6 修改字段操作对比)
- [4. 删除数据表](#4. 删除数据表)
- 附录:常用命令速查表
第一部分:数据库(库)的操作
1. 创建数据库
基本语法
sql
CREATE DATABASE [IF NOT EXISTS] 数据库名
[DEFAULT] CHARACTER SET 字符集名
[DEFAULT] COLLATE 校验规则名;
语法说明:
CREATE DATABASE:创建数据库的关键字,必须项[IF NOT EXISTS]:可选项,加上后如果数据库已存在不会报错,而是给出警告CHARACTER SET:指定数据库使用的字符集,不指定则使用系统默认值COLLATE:指定字符集的校验规则,不指定则使用字符集对应的默认规则
创建示例
示例 1:最简单的创建方式
sql
CREATE DATABASE mydb1;
这条命令创建了一个名为 mydb1 的数据库,字符集和校验规则都采用系统默认值(通常是 utf8 和 utf8_general_ci)。
示例 2:显式指定字符集
sql
CREATE DATABASE mydb2 CHARACTER SET utf8;
示例 3:同时指定字符集和校验规则
sql
CREATE DATABASE mydb3 CHARACTER SET utf8 COLLATE utf8_general_ci;
示例 4:避免重复创建时报错
sql
CREATE DATABASE IF NOT EXISTS mydb1;
如果 mydb1 已经存在,不会抛出错误,而是返回一条警告信息。
2. 字符集与校验规则
2.1 什么是字符集
字符集决定了数据库能存储哪些语言的文字。常见的字符集有:
| 字符集 | 说明 |
|---|---|
utf8 |
支持中文、英文等多语言,最常用 |
gbk |
支持中文,兼容老系统 |
latin1 |
只支持西欧字符,不支持中文 |
utf8mb4 |
utf8 的超集,支持 emoji 表情等 4 字节字符 |
2.2 什么是校验规则
校验规则(Collation)决定了字符串比较和排序时的行为,最核心的差异是是否区分大小写。
| 校验规则 | 大小写敏感 | 说明 |
|---|---|---|
utf8_general_ci |
不区分 | 默认规则,查询时不区分大小写 |
utf8_bin |
区分 | 按二进制比较,严格区分大小写 |
ci是 Case Insensitive 的缩写,bin表示按二进制方式比较。
2.3 查看系统默认配置
sql
-- 查看当前默认字符集
SHOW VARIABLES LIKE 'character_set_database';
-- 查看当前默认校验规则
SHOW VARIABLES LIKE 'collation_database';
2.4 查看 MySQL 支持的所有字符集
sql
SHOW CHARSET;
2.5 查看 MySQL 支持的所有校验规则
sql
SHOW COLLATION;
2.6 校验规则的实际影响(重点理解)
校验规则会直接影响查询结果和排序行为,下面通过一个完整的实验来演示。
第一步:分别创建两个数据库
sql
-- 创建使用不区分大小写规则的数据库
CREATE DATABASE test1 COLLATE utf8_general_ci;
-- 创建使用区分大小写规则的数据库
CREATE DATABASE test2 COLLATE utf8_bin;
第二步:在两个库中分别建表并插入相同数据
sql
-- 在 test1 中操作
USE test1;
CREATE TABLE person(name VARCHAR(20));
INSERT INTO person VALUES('a');
INSERT INTO person VALUES('A');
INSERT INTO person VALUES('b');
INSERT INTO person VALUES('B');
-- 在 test2 中操作
USE test2;
CREATE TABLE person(name VARCHAR(20));
INSERT INTO person VALUES('a');
INSERT INTO person VALUES('A');
INSERT INTO person VALUES('b');
INSERT INTO person VALUES('B');
第三步:对比查询结果
不区分大小写查询(test1):
sql
USE test1;
SELECT * FROM person WHERE name = 'a';
结果:返回 a 和 A 两条记录,因为 utf8_general_ci 认为 a 和 A 是相同的。
区分大小写查询(test2):
sql
USE test2;
SELECT * FROM person WHERE name = 'a';
结果:只返回 a 一条记录,因为 utf8_bin 认为 a 和 A 是不同的。
第四步:对比排序结果
sql
-- 不区分大小写的排序
USE test1;
SELECT * FROM person ORDER BY name;
-- 结果:a, A, b, B(小写和大写混合排列)
-- 区分大小写的排序
USE test2;
SELECT * FROM person ORDER BY name;
-- 结果:A, B, a, b(大写字母排在前面,因为大写字母的 ASCII 值更小)
实际开发建议 :大多数业务场景使用
utf8_general_ci就够了。只有在需要严格区分大小写的场景(如密码比对、验证码校验)才使用utf8_bin。
3. 查看数据库
3.1 列出所有数据库
sql
SHOW DATABASES;
3.2 查看指定数据库的创建语句
sql
SHOW CREATE DATABASE 数据库名;
这条命令会返回创建该数据库时的完整 SQL 语句,包括字符集和校验规则信息。
示例:
sql
SHOW CREATE DATABASE mydb1;
返回结果类似:
+----------+----------------------------------------------------------------+
| Database | Create Database |
+----------+----------------------------------------------------------------+
| mydb1 | CREATE DATABASE `mydb1` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+----------------------------------------------------------------+
返回结果中的特殊符号说明:
- 反引号:用于包裹数据库名,防止名称与 SQL 关键字冲突
/*!40100 ... */:这不是注释,而是 MySQL 的版本兼容语法,表示"如果 MySQL 版本 >= 4.01,就执行这段语句"
4. 修改数据库
数据库创建后,可以修改的内容主要是字符集 和校验规则。
语法
sql
ALTER DATABASE 数据库名
[DEFAULT] CHARACTER SET 新字符集名
[DEFAULT] COLLATE 新校验规则名;
示例:将字符集从 utf8 改为 gbk
sql
ALTER DATABASE mydb1 CHARACTER SET gbk;
验证修改是否生效:
sql
SHOW CREATE DATABASE mydb1;
返回结果中字符集已经变成 gbk。
5. 删除数据库
语法
sql
DROP DATABASE [IF EXISTS] 数据库名;
示例
sql
DROP DATABASE IF EXISTS mydb1;
删除操作的影响
执行删除后会发生以下事情:
- 该数据库在
SHOW DATABASES结果中消失 - 该数据库对应的文件夹从磁盘上被删除
- 库中的所有表和数据全部被删除,且无法恢复
重要提醒:删除数据库是不可逆操作,生产环境务必谨慎。建议删除前先做好备份。
6. 备份与恢复
6.1 备份整个数据库
在终端(不是 MySQL 客户端)执行:
bash
mysqldump -P3306 -u root -p123456 -B 数据库名 > /path/to/backup.sql
参数说明:
| 参数 | 含义 |
|---|---|
-P3306 |
指定 MySQL 端口号 |
-u root |
指定登录用户名 |
-p123456 |
指定密码(注意 -p 和密码之间没有空格) |
-B |
关键参数,表示备份整个数据库(包含建库语句) |
> /path/to/backup.sql |
指定备份文件的保存路径 |
实际示例:
bash
mysqldump -P3306 -u root -p123456 -B mydb1 > /home/backup/mydb1.sql
备份生成的 .sql 文件本质上是一系列 SQL 语句的集合,包含了建库、建表、插入数据的完整流程。
6.2 备份指定的表
bash
mysqldump -u root -p123456 数据库名 表名1 表名2 > /path/to/backup.sql
6.3 同时备份多个数据库
bash
mysqldump -u root -p123456 -B 数据库名1 数据库名2 > /path/to/backup.sql
6.4 恢复数据库
在 MySQL 客户端中执行:
sql
SOURCE /path/to/backup.sql;
注意事项 :如果备份时没有使用 -B 参数,恢复时需要先手动创建空数据库,然后切换到该库,再执行 SOURCE 命令。
sql
CREATE DATABASE mydb1;
USE mydb1;
SOURCE /path/to/backup.sql;
7. 查看连接情况
语法
sql
SHOW PROCESSLIST;
示例输出
+----+------+-----------+------+---------+------+-------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+-----------+------+---------+------+-------+------------------+
| 2 | root | localhost | test | Sleep | 1386 | | NULL |
| 3 | root | localhost | NULL | Query | 0 | NULL | show processlist |
+----+------+-----------+------+---------+------+-------+------------------+
结果说明:
Id:连接的唯一标识User:连接使用的用户名Host:连接来源的地址db:当前使用的数据库Command:当前正在执行的命令类型(Sleep表示空闲,Query表示正在执行查询)Time:状态持续的时间(秒)Info:正在执行的 SQL 语句
实际用途:
- 排查数据库连接慢的问题,查看是否有大量空闲连接
- 检查是否有异常连接,如果发现不认识的用户或来源地址,可能存在安全风险
第二部分:数据表(表)的操作
1. 创建数据表
基本语法
sql
CREATE TABLE 表名 (
字段名1 数据类型 [COMMENT '字段说明'],
字段名2 数据类型 [COMMENT '字段说明'],
字段名3 数据类型 [COMMENT '字段说明']
) CHARACTER SET 字符集 ENGINE 存储引擎;
语法说明:
字段名:列的名称数据类型:列存储数据的类型(如INT、VARCHAR、DATE等)COMMENT:字段的备注说明,方便团队协作理解CHARACTER SET:指定表的字符集,不指定则继承数据库的字符集ENGINE:指定存储引擎,常见的有InnoDB(默认)和MyISAM
创建示例
sql
CREATE TABLE users (
id INT COMMENT '用户ID',
name VARCHAR(20) COMMENT '用户名',
password CHAR(32) COMMENT '密码,32位MD5值',
birthday DATE COMMENT '生日'
) CHARACTER SET utf8 ENGINE MyISAM;
存储引擎与文件的关系
不同的存储引擎在磁盘上生成的文件不同:
MyISAM 引擎(每个表生成 3 个文件):
| 文件 | 作用 |
|---|---|
表名.frm |
存储表的结构定义 |
表名.MYD |
存储表中的数据 |
表名.MYI |
存储表的索引信息 |
InnoDB 引擎(默认引擎):
- 表结构和数据存储在系统表空间中,不像 MyISAM 那样每个表独立文件
- 支持事务、行级锁、外键等高级特性
实际开发建议:除非有特殊需求,使用默认的 InnoDB 引擎即可。
2. 查看表结构
查看表的字段信息
sql
DESC 表名;
或者使用完整写法:
sql
DESCRIBE 表名;
输出示例
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
| password | char(32) | YES | | NULL | |
| birthday | date | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
各列含义:
| 列名 | 含义 |
|---|---|
Field |
字段名称 |
Type |
字段的数据类型和长度 |
Null |
是否允许为空(YES = 允许,NO = 不允许) |
Key |
索引类型(PRI = 主键,UNI = 唯一索引,MUL = 普通索引) |
Default |
字段的默认值 |
Extra |
额外信息(如 AUTO_INCREMENT 自增) |
查看建表语句
sql
SHOW CREATE TABLE 表名;
3. 修改表结构
在实际项目中,表结构经常需要调整,比如增删字段、修改字段类型、更改表名等。
3.1 添加新字段
sql
ALTER TABLE 表名 ADD 字段名 数据类型 [COMMENT '说明'] [AFTER 已有字段名];
示例 :在 users 表的 birthday 字段后面添加一个 assets 字段
sql
ALTER TABLE users ADD assets VARCHAR(100) COMMENT '图片路径' AFTER birthday;
验证结果:
sql
DESC users;
+----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
| password | char(32) | YES | | NULL | |
| birthday | date | YES | | NULL | |
| assets | varchar(100) | YES | | NULL | |
+----------+--------------+------+-----+---------+-------+
新增字段对表中已有的数据没有影响,原有记录在新字段上的值为 NULL。
3.2 修改字段类型或长度
sql
ALTER TABLE 表名 MODIFY 字段名 新数据类型;
示例 :将 name 字段的长度从 20 改为 60
sql
ALTER TABLE users MODIFY name VARCHAR(60);
3.3 修改字段名称
sql
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 新数据类型;
示例 :将 name 字段改名为 xingming
sql
ALTER TABLE users CHANGE name xingming VARCHAR(60);
注意 :
CHANGE操作需要同时指定新字段名和完整的数据类型,不能省略类型。
3.4 删除字段
sql
ALTER TABLE 表名 DROP 字段名;
示例 :删除 password 字段
sql
ALTER TABLE users DROP password;
重要提醒:删除字段会同时删除该字段的所有数据,操作前请确认是否需要备份。
3.5 修改表名
sql
ALTER TABLE 旧表名 RENAME TO 新表名;
或者省略 TO:
sql
ALTER TABLE 旧表名 RENAME 新表名;
示例 :将 users 表改名为 employee
sql
ALTER TABLE users RENAME TO employee;
3.6 修改字段操作对比
| 操作 | 命令 | 能改名 | 能改类型 |
|---|---|---|---|
MODIFY |
ALTER TABLE 表名 MODIFY 字段 新类型; |
不能 | 能 |
CHANGE |
ALTER TABLE 表名 CHANGE 旧名 新名 新类型; |
能 | 能 |
DROP |
ALTER TABLE 表名 DROP 字段名; |
删除字段 | 删除字段 |
4. 删除数据表
语法
sql
DROP [TEMPORARY] TABLE [IF EXISTS] 表名1 [, 表名2 ...];
示例
sql
-- 删除单个表
DROP TABLE IF EXISTS users;
-- 同时删除多个表
DROP TABLE IF EXISTS t1, t2, t3;
附录:常用命令速查表
数据库操作
| 操作 | 命令 |
|---|---|
| 创建数据库 | CREATE DATABASE 数据库名; |
| 创建数据库(避免重复报错) | CREATE DATABASE IF NOT EXISTS 数据库名; |
| 查看所有数据库 | SHOW DATABASES; |
| 查看建库语句 | SHOW CREATE DATABASE 数据库名; |
| 修改字符集 | ALTER DATABASE 数据库名 CHARACTER SET 新字符集; |
| 删除数据库 | DROP DATABASE IF EXISTS 数据库名; |
| 备份数据库 | mysqldump -u root -p -B 数据库名 > backup.sql |
| 恢复数据库 | SOURCE /path/to/backup.sql; |
| 查看连接 | SHOW PROCESSLIST; |
数据表操作
| 操作 | 命令 |
|---|---|
| 创建表 | CREATE TABLE 表名 (字段 类型, ...); |
| 查看表结构 | DESC 表名; |
| 查看建表语句 | SHOW CREATE TABLE 表名; |
| 添加字段 | ALTER TABLE 表名 ADD 字段 类型 AFTER 已有字段; |
| 修改字段类型 | ALTER TABLE 表名 MODIFY 字段 新类型; |
| 修改字段名 | ALTER TABLE 表名 CHANGE 旧名 新名 新类型; |
| 删除字段 | ALTER TABLE 表名 DROP 字段名; |
| 修改表名 | ALTER TABLE 旧表名 RENAME TO 新表名; |
| 删除表 | DROP TABLE IF EXISTS 表名; |
字符集与校验规则
| 操作 | 命令 |
|---|---|
| 查看默认字符集 | SHOW VARIABLES LIKE 'character_set_database'; |
| 查看默认校验规则 | SHOW VARIABLES LIKE 'collation_database'; |
| 查看支持的字符集 | SHOW CHARSET; |
| 查看支持的校验规则 | SHOW COLLATION; |