数据库是项目数据存储的基石,而 “库级操作”(如创建、修改、备份)是 MySQL 使用的基础。很多开发者在初期容易忽略字符集、校验规则的配置,或因备份不当导致数据丢失。本文将以 “库的全生命周期” 为线索,详细讲解 MySQL 数据库的创建、配置、修改、删除、备份与恢复,同时深入解析字符集和校验规则对业务的影响,帮你规范库级操作,避免踩坑。
一、数据库创建:不止是 “CREATE DATABASE”
创建数据库看似简单,但需根据业务需求配置字符集和校验规则,否则可能出现中文乱码、查询结果不符合预期等问题。
1.1 完整创建语法
MySQL 创建数据库的完整语法支持 “条件判断” 和 “属性配置”,覆盖大部分场景:
CREATE DATABASE [IF NOT EXISTS] db_name
[create_specification [, create_specification] ...];
-- 可选配置项(create_specification)
[DEFAULT] CHARACTER SET charset_name -- 指定字符集
[DEFAULT] COLLATE collation_name -- 指定校验规则
IF NOT EXISTS:避免数据库已存在时报错(推荐添加,防止误操作);
CHARACTER SET:指定数据库默认字符集(如utf8、utf8mb4);
COLLATE:指定字符集的校验规则(如utf8_general_ci、utf8_bin)。
1.2 实战案例:不同场景的创建方式
根据业务需求,数据库创建可分为 “默认配置”“指定字符集”“指定字符集 + 校验规则” 三种场景:
场景 1:默认配置创建(快速测试)
若无需特殊配置(如本地测试),可直接创建,MySQL 会使用系统默认字符集(通常为utf8)和校验规则(utf8_general_ci):
-- 创建名为db1的数据库(存在则不报错)
CREATE DATABASE IF NOT EXISTS db1;
场景 2:指定字符集(支持中文)
若需存储中文,需确保字符集为utf8或utf8mb4(utf8mb4支持 emoji),避免中文乱码:
-- 创建支持中文的db2数据库,字符集为utf8
CREATE DATABASE IF NOT EXISTS db2
CHARACTER SET utf8;
场景 3:指定字符集 + 校验规则(精准控制)
若业务需区分大小写查询(如用户名校验),需指定 “区分大小写的校验规则”;若需不区分大小写(如商品名称查询),则指定 “不区分大小写的校验规则”:
-- 创建db3,字符集utf8,校验规则不区分大小写(默认)
CREATE DATABASE IF NOT EXISTS db3
CHARACTER SET utf8
COLLATE utf8_general_ci;
-- 创建db4,字符集utf8,校验规则区分大小写
CREATE DATABASE IF NOT EXISTS db4
CHARACTER SET utf8
COLLATE utf8_bin;
二、字符集与校验规则:影响业务的关键配置
字符集决定 “数据用什么编码存储”,校验规则决定 “数据如何比较(如查询、排序)”,两者直接影响业务逻辑的正确性。
2.1 查看系统默认配置
在创建数据库前,可先查看系统默认的字符集和校验规则,了解当前环境:
-- 查看默认数据库字符集
show variables like 'character_set_database';
-- 查看默认数据库校验规则
show variables like 'collation_database';
示例输出(MySQL 5.7 默认配置):
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| character_set_database | utf8 |
+------------------------+-------+
+----------------------+-----------------+
| Variable_name | Value |
+----------------------+-----------------+
| collation_database | utf8_general_ci |
+----------------------+-----------------+
2.2 查看支持的字符集与校验规则
MySQL 支持多种字符集和校验规则,可通过以下命令查看完整列表:
-- 查看所有支持的字符集(含描述)
show charset;
-- 查看所有支持的校验规则(含对应字符集)
show collation;
常用字符集说明:
utf8:支持大部分中文,但不支持 emoji(实际存储长度为 3 字节);
utf8mb4:utf8的扩展,支持 emoji(存储长度为 4 字节,推荐用于社交、电商场景);
gbk:仅支持中文,不支持其他语言(国内早期项目常用,现已逐步被utf8替代)。
2.3 校验规则对业务的影响
校验规则直接影响 “查询结果” 和 “排序逻辑”,以下通过实战对比 “区分大小写” 和 “不区分大小写” 的差异:
实验 1:不区分大小写(utf8_general_ci)
-- 1. 创建数据库,校验规则不区分大小写
CREATE DATABASE IF NOT EXISTS test_ci
COLLATE utf8_general_ci;
USE test_ci;
-- 2. 创建表并插入数据
CREATE TABLE person (name varchar(20));
INSERT INTO person VALUES ('a'), ('A'), ('b'), ('B');
-- 3. 查询(不区分大小写)
SELECT * FROM person WHERE name = 'a';
-- 结果:返回'a'和'A'(2行)
-- 4. 排序(不区分大小写,按字母顺序)
SELECT * FROM person ORDER BY name;
-- 结果:a、A、b、B(或A、a、B、b,取决于MySQL版本,核心是不区分大小写)
实验 2:区分大小写(utf8_bin)
-- 1. 创建数据库,校验规则区分大小写
CREATE DATABASE IF NOT EXISTS test_bin
COLLATE utf8_bin;
USE test_bin;
-- 2. 创建表并插入相同数据
CREATE TABLE person (name varchar(20));
INSERT INTO person VALUES ('a'), ('A'), ('b'), ('B');
-- 3. 查询(区分大小写)
SELECT * FROM person WHERE name = 'a';
-- 结果:仅返回'a'(1行)
-- 4. 排序(区分大小写,按ASCII码排序,大写字母ASCII码小于小写)
SELECT * FROM person ORDER BY name;
-- 结果:A、B、a、b
结论
若业务需区分大小写(如用户名登录、代码关键字存储),选择utf8_bin;
若业务不区分大小写(如商品名称查询、文章标题搜索),选择utf8_general_ci(默认,更符合日常习惯)。
三、数据库操纵:查看、修改与删除
创建数据库后,需掌握 “查看配置”“修改属性”“安全删除” 的操作,确保数据库管理的规范性。
3.1 查看数据库
查看所有数据库
快速了解当前 MySQL 服务器中的所有数据库:
show databases;
示例输出:
+--------------------+
| Database |
+--------------------+
| information_schema | -- 系统数据库(元数据)
| db1 | -- 自定义数据库
| mysql | -- 系统数据库(用户、权限)
| test_ci | -- 自定义数据库
+--------------------+
查看数据库创建语句(关键)
查看数据库的详细配置(字符集、校验规则),避免遗忘历史配置:
show create database db2;
示例输出:
+----------+----------------------------------------------------------------+
| Database | Create Database |
+----------+----------------------------------------------------------------+
| db2 | CREATE DATABASE `db2` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+----------------------------------------------------------------+
反引号`:防止数据库名与关键字冲突(如create database order;,order是 SQL 关键字);
/*!40100 ... */:条件执行语句,表示 “若 MySQL 版本≥4.0.100,执行该配置”,确保兼容性。
3.2 修改数据库
MySQL 仅支持修改数据库的 “字符集” 和 “校验规则”,不支持修改数据库名(修改名称需通过备份→删除→恢复实现,不推荐)。
修改语法
ALTER DATABASE db_name
[alter_specification [, alter_specification] ...];
-- 可选修改项
[DEFAULT] CHARACTER SET charset_name
[DEFAULT] COLLATE collation_name
实战案例:修改字符集
将db2的字符集从utf8改为utf8mb4(支持 emoji):
-- 修改db2的字符集
ALTER DATABASE db2
CHARACTER SET utf8mb4
COLLATE utf8mb4_general_ci;
-- 验证修改结果
show create database db2;
-- 输出:CREATE DATABASE `db2` /*!40100 DEFAULT CHARACTER SET utf8mb4 */
3.3 删除数据库
删除数据库会级联删除所有表和数据,且无法恢复,需格外谨慎。
删除语法
DROP DATABASE [IF EXISTS] db_name;
IF EXISTS:避免数据库不存在时报错(推荐添加)。
实战案例
-- 删除名为test_bin的数据库(存在则删除)
DROP DATABASE IF EXISTS test_bin;
注意:生产环境中,删除数据库前必须确认:
- 数据已备份;
- 业务已下线,无程序依赖该数据库;
- 操作权限已审批(避免误删)。
四、数据库备份与恢复:避免数据丢失的关键
数据是项目的核心资产,定期备份是保障数据安全的必要措施。MySQL 提供mysqldump工具实现库级备份,支持全库、多库、单表备份。
4.1 备份:使用 mysqldump 工具
mysqldump是 MySQL 自带的备份工具,需在操作系统命令行执行(非 MySQL 客户端),支持多种备份场景。
语法格式
# 全库备份(含创建数据库语句)
mysqldump -h 主机IP -P 端口 -u 用户名 -p密码 -B 数据库名 > 备份文件路径
# 单表备份(不含创建数据库语句)
mysqldump -h 主机IP -P 端口 -u 用户名 -p密码 数据库名 表名1 表名2 > 备份文件路径
# 多库备份
mysqldump -h 主机IP -P 端口 -u 用户名 -p密码 -B 数据库名1 数据库名2 > 备份文件路径
-h:数据库服务器 IP(本地可省略,默认127.0.0.1);
-P:端口号(默认3306,可省略);
-u:用户名(如root);
-p:密码(-p后可直接跟密码,或仅写-p后交互式输入,推荐交互式输入,避免密码明文暴露);
-B:备份时包含 “创建数据库” 和 “使用数据库” 语句(恢复时无需手动创建库,推荐添加);
>:重定向输出到备份文件(.sql格式,本质是 SQL 语句集合)。
实战案例
案例 1:全库备份(本地,含创建语句)
备份db2数据库到D:/backup/db2_backup.sql(Windows):
# 交互式输入密码(推荐)
mysqldump -u root -p -B db2 > D:/backup/db2_backup.sql
# 执行后输入密码,备份完成后可打开.sql文件查看(包含CREATE DATABASE、CREATE TABLE、INSERT语句)
案例 2:单表备份(仅备份 person 表)
备份db2中的person表到D:/backup/person_backup.sql:
mysqldump -u root -p db2 person > D:/backup/person_backup.sql
# 注意:无-B参数,备份文件不含CREATE DATABASE语句
案例 3:多库备份(同时备份 db1 和 db2)
mysqldump -u root -p -B db1 db2 > D:/backup/multi_db_backup.sql
4.2 恢复:使用 source 命令
恢复数据库需在MySQL 客户端执行,通过source命令执行备份文件中的 SQL 语句。
恢复流程
- 打开 MySQL 客户端并登录;
- 若备份文件无
-B参数(不含创建数据库语句),需先创建空数据库并使用; - 执行
source命令恢复。
实战案例
案例 1:恢复含 - B 参数的备份(全库)
恢复db2_backup.sql(含 CREATE DATABASE 语句):
-- 登录MySQL后直接执行
source D:/backup/db2_backup.sql;
-- 执行后自动创建db2(若不存在)并恢复数据
案例 2:恢复无 - B 参数的备份(单表)
恢复person_backup.sql(不含 CREATE DATABASE 语句):
-- 1. 先创建并使用数据库
CREATE DATABASE IF NOT EXISTS db2;
USE db2;
-- 2. 恢复表数据
source D:/backup/person_backup.sql;
4.3 备份注意事项
- 生产环境推荐交互式输入密码:避免在命令行中明文暴露密码(如
mysqldump -u root -p123456 ...,密码会被系统日志记录); - 定期备份:使用定时任务(如 Linux 的
crontab、Windows 的任务计划)自动备份,避免手动遗漏; - 验证备份文件:备份后打开
.sql文件,确认包含CREATE和INSERT语句,避免备份空文件; - 跨版本备份需谨慎:高版本 MySQL 备份的文件,恢复到低版本时可能因语法不兼容失败(如 MySQL 8.0 的备份无法直接恢复到 5.7)。
五、查看数据库连接:监控与安全
生产环境中,需定期查看数据库连接情况,排查异常连接(如黑客入侵、程序连接泄漏),保障数据库安全。
5.1 查看连接命令
show processlist;
示例输出:
+----+------+-----------+------+---------+------+-------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+-----------+------+---------+------+-------+------------------+
| 2 | root | localhost | db2 | Sleep | 120 | | NULL |
| 3 | root | localhost | NULL | Query | 0 | NULL | show processlist |
+----+------+-----------+------+---------+------+-------+------------------+
5.2 关键字段解读
| 字段 | 含义 | 安全 / 性能关注点 |
|---|---|---|
Id | 连接 ID | 定位异常连接,可通过kill Id关闭异常连接 |
User | 连接用户名 | 若出现非授权用户(如anonymous),可能被入侵 |
Host | 连接来源 IP | 若出现陌生 IP(非业务服务器 IP),可能被入侵 |
db | 当前使用的数据库 | 查看连接是否访问了敏感数据库(如mysql系统库) |
Command | 连接状态 | Sleep表示空闲连接,若大量Sleep连接且Time较大,可能是程序连接泄漏 |
Time | 状态持续时间(秒) | 大量长时间Sleep连接(如超过 3600 秒)会占用连接数,需优化程序关闭连接 |
Info | 执行的 SQL 语句 | 查看是否有慢 SQL(如select * from large_table),影响数据库性能 |
实战:关闭异常连接
若发现陌生 IP 的连接,可通过kill命令关闭:
-- 关闭Id=5的异常连接
kill 5;
六、总结
本文覆盖了 MySQL 数据库从 “创建” 到 “删除” 再到 “备份恢复” 的全生命周期操作,核心要点如下:
- 创建数据库:根据业务需求配置字符集(
utf8mb4支持 emoji)和校验规则(区分 / 不区分大小写); - 字符集与校验规则:直接影响数据存储和查询结果,需提前与业务对齐;
- 修改与删除:仅支持修改字符集 / 校验规则,删除需谨慎并备份;
- 备份恢复:使用
mysqldump和source,生产环境需定期自动备份; - 连接监控:通过
show processlist排查异常连接,保障数据库安全。
3977

被折叠的 条评论
为什么被折叠?



