MySQL库与表的操作

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 的数据库,字符集和校验规则都采用系统默认值(通常是 utf8utf8_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';

结果:返回 aA 两条记录,因为 utf8_general_ci 认为 aA 是相同的。

区分大小写查询(test2):

sql 复制代码
USE test2;
SELECT * FROM person WHERE name = 'a';

结果:只返回 a 一条记录,因为 utf8_bin 认为 aA 是不同的。

第四步:对比排序结果

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;

删除操作的影响

执行删除后会发生以下事情:

  1. 该数据库在 SHOW DATABASES 结果中消失
  2. 该数据库对应的文件夹从磁盘上被删除
  3. 库中的所有表和数据全部被删除,且无法恢复

重要提醒:删除数据库是不可逆操作,生产环境务必谨慎。建议删除前先做好备份。


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 存储引擎;

语法说明

  • 字段名:列的名称
  • 数据类型:列存储数据的类型(如 INTVARCHARDATE 等)
  • 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;

相关推荐
着迷不白2 小时前
Linux 磁盘管理完全指南:分区、文件系统、挂载与 LVM 实战
linux·运维·服务器
lilihuigz2 小时前
产品附加选项插件WooCommerce Product Add-Ons:9种字段类型与3种定价模式提升销售 - 易服客工作室
数据库·mysql·wordpress插件·woocommerce扩展·定制选项
山川而川-R2 小时前
LangChain
linux·运维·服务器
QH_ShareHub2 小时前
Linux 根目录结构详解
linux·运维·服务器
360智汇云2 小时前
Valkey 9.1上线:从Redis兼容到AI数据能力探索
数据库
标致的自行车2 小时前
Entity Framework之问题收集
jvm·数据库·oracle
啵啵鱼爱吃小猫咪3 小时前
Franka机械臂安装实时内核
数据库·postgresql
郝学胜-神的一滴3 小时前
CMake 038:OBJECT目标复用编译+Linux动态库版本自动化管理
linux·c++·程序人生·软件工程·软件构建·cmake·工程配置
单位圆的日常3 小时前
FRP反向隧道实现异地SSH家用Linux
linux·运维·ssh·frp