MySQL笔记---对数据库(database)的操作
1. 创建数据库
基本语法:
CREATE DATABASE 数据库名称;
为了避免创建已存在的数据库时出错,通常会加上 IF NOT EXISTS 条件:
-- 如果数据库不存在则创建
CREATE DATABASE IF NOT EXISTS 数据库名称;
在MySQL当中,还支持指定database使用的字符集和校验规则(排序规则):
CREATE DATABASE IF NOT EXISTS 数据库名称
CHARACTER SET 字符集
COLLATE 排序规则;
或者:
CREATE DATABASE IF NOT EXISTS 数据库名称
CHARSET=字符集
COLLATE=排序规则;
例如,创建一个使用utf8字符集,和utf8_general_ci排序规则的数据库:
CREATE DATABASE test_db CHARSET=utf8 COLLATE=utf8_general_ci;
使用某个数据库:
USE 数据库名称;
2. 字符集与排序规则
字符集(Character Set)和排序规则(Collation)是数据库中处理文本数据的两个核心概念,直接影响字符的存储、显示和比较逻辑。
2.1 字符集(Character Set)
字符集是一套字符的编码规则,定义了如何用二进制数据(0 和 1)表示现实世界中的字符(如字母、汉字、符号等)。它相当于一个 “字典”,规定了每个字符对应的数字编码。
常见字符集举例:
- ASCII:最早的字符集,仅包含英文字母、数字和部分符号(共 128 个字符),无法表示中文、日文等非英文字符。
- GBK/GB2312:中文字符集,GB2312 支持简体中文,GBK 在其基础上扩展了繁体中文等。
- UTF-8:国际通用字符集,支持几乎所有语言(包括中文、英文、日文等),是目前互联网和数据库的主流选择。MySQL 中常用的utf8mb4是 UTF-8 的扩展,支持 emoji 表情。
2.2. 排序规则(Collation)
排序规则是基于字符集的一套排序和比较规则,定义了字符之间的大小关系、排序方式(如字母顺序)以及比较时是否区分大小写、 accents(重音符号)等。
简单说:字符集决定 “如何存储字符”,排序规则决定 “如何比较和排序字符”。
常见排序规则举例(以 UTF-8 字符集为例):
- utf8mb4_unicode_ci: ci 表示 Case Insensitive(不区分大小写),即 A 和 a 被视为相同。 支持多语言排序,遵循 Unicode 标准,排序结果更符合人类习惯(如处理 accented 字符:é 和 e 的排序)。
- utf8mb4_bin: bin 表示 Binary(二进制),直接按字符的二进制编码比较,区分大小写(A 和 a 被视为不同)。
- utf8mb4_general_ci: 排序规则较简单,性能略好,但对某些语言(如欧洲语言)的排序可能不够准确。
2.3. 两者的关系
- 一个字符集可以对应多个排序规则(如 UTF-8 有十几种排序规则),但一个排序规则只能属于一个字符集。
- 创建数据库或表时,若不指定排序规则,数据库会使用字符集的默认排序规则(如 MySQL 中utf8mb3的默认排序规则是utf8mb3_general_ci)。
2.4 相关操作
2.4.1 查看系统默认字符集与排序规则
// 查看默认字符集
show variables like 'character_set_database';
// 查看默认排序规则
show variables like 'collation_database';
2.4.2 查看数据库支持的字符集
show charset;
2.4.3 查看数据库支持的排序规则
show collation;
太长了,这里就不截完了。
2.4.4 不同排序规则对于查询结果的影响
排序规则utf8_general_ci是不区分大小写的,而utf8_bin会区分大小写。
我们分别创建使用上述两种排序规则的数据库test1和test2:
CREATE DATABASE test1 COLLATE=utf8_general_ci; // 不区分大小写
CREATE DATABASE test2 COLLATE=utf8_bin; // 区分大小写
接着,在两个数据库当中分别创建person表并插入数据:
USE test1;
CREATE TABLE person(name VARCHAR(20));
INSERT INTO person VALUE('a');
INSERT INTO person VALUE('A');
INSERT INTO person VALUE('b');
INSERT INTO person VALUE('B');USE test2;
CREATE TABLE person(name VARCHAR(20));
INSERT INTO person VALUE('a');
INSERT INTO person VALUE('A');
INSERT INTO person VALUE('b');
INSERT INTO person VALUE('B');
在test1的person表当中查找 name='a' 的记录:
mysql> SELECT * FROM person WHERE name='a';
+------+
| name |
+------+
| a |
| A |
+------+
2 rows in set (0.00 sec)
在test2的person表中查找 name='a' 的记录:
mysql> SELECT * FROM person WHERE name='a';
+------+
| name |
+------+
| a |
+------+
1 row in set (0.00 sec)
3. 操纵数据库
3.1 查看数据库
show databases;
我们之前说过,数据库其实就是一个文件目录,表就是对应文件目录中的文件。实际上,MySQL的数据库都存放在这个目录当中:
/var/lib/mysql
3.2 查看当前正在使用的数据库
SELECT DATABASE();
3.2 显示创建语句
show create database 数据库名称;
mysql> SHOW CREATE DATABASE hello_world;
+-------------+------------------------------------------------------------------------------------------------------------+
| Database | Create Database |
+-------------+------------------------------------------------------------------------------------------------------------+
| hello_world | CREATE DATABASE `hello_world` /*!40100 DEFAULT CHARACTER SET utf8mb3 */ /*!80016 DEFAULT ENCRYPTION='N' */ |
+-------------+------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
说明:
- MySQL建议关键字使用大写,所以无论创建时数据库时关键字是大写还是小写,此时显示出来的都是大写;
- 数据库名字的反引号``,是为了防止使用的数据库名刚好是关键字;
- /*!40100 DEFAULT.... */ 这个不是注释,表示当前mysql版本大于4.01版本,就执行这句话(类似于条件编译)。
3.3 修改数据库
3.3.1 修改数据库属性(字符集、排序规则等)
-- 修改数据库的字符集和排序规则
ALTER DATABASE 数据库名CHARACTER SET = utf8mb4 -- 新字符集COLLATE = utf8mb4_unicode_ci; -- 新排序规则-- 仅修改排序规则(需与当前字符集兼容)
ALTER DATABASE 数据库名COLLATE = utf8mb4_bin;
3.3.2 修改数据库名称
在 MySQL 中,直接修改数据库名的操作需要特别注意:MySQL 5.1.7 及以上版本已移除 RENAME DATABASE 命令(因存在数据丢失风险),因此不推荐使用该命令。
目前,我们有两种安全的修改数据库名称的方法,我们先介绍其中一种:通过 RENAME TABLE 迁移表(适用于中小型数据库)。
步骤:
- 创建新数据库
- 将旧数据库中的表逐个迁移到新数据库
- 确认数据无误后删除旧数据库
-- 1. 创建新数据库(指定与旧库一致的字符集和排序规则)
CREATE DATABASE IF NOT EXISTS 新数据库名 CHARACTER SET = 旧库字符集 COLLATE = 旧库排序规则;-- 2. 切换到旧数据库
USE 旧数据库名;-- 3. 生成迁移表的SQL语句(查询所有表并生成RENAME命令)
SELECT CONCAT('RENAME TABLE `', TABLE_NAME, '` TO `新数据库名`.`', TABLE_NAME, '`;'
) AS 迁移命令
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = '旧数据库名';-- 4. 执行上一步生成的所有RENAME命令(逐个或批量执行)
-- 示例:
RENAME TABLE `旧数据库名`.`表1` TO `新数据库名`.`表1`;
RENAME TABLE `旧数据库名`.`表2` TO `新数据库名`.`表2`;-- 5. (可选)迁移视图、存储过程等其他对象
-- 视图需要重新创建(因视图依赖数据库名)
-- 存储过程/函数可通过 SHOW CREATE PROCEDURE 导出后在新库创建-- 6. 确认数据无误后,删除旧数据库
DROP DATABASE 旧数据库名;
注意事项:
- 权限处理:迁移后需重新为新数据库设置用户权限(可通过 SHOW GRANTS 查看旧库权限,再在新库执行对应授权命令)。
- 业务停服:操作期间建议暂停数据库写入(如关闭应用),避免数据不一致。
- 备份优先:无论使用哪种方法,操作前务必备份旧数据库。
- 特殊对象:视图、触发器、事件等依赖数据库名的对象,需手动重新创建或修改引用。
3.3.3 删除数据库
DROP DATABASE 数据库名称;
4. 数据库的备份与恢复
4.1 备份的基本概念
MySQL对数据库的备份实际上并不是备份数据库的数据(数据库文件),而是将自数据库创建以来,用户进行的所有与其相关的操作进行备份。
即,备份用户对数据库进行操作的SQL语句。假如数据库被误删,用户就可以加载这个备份文件,MDBS重新执行其中所有的SQL语句,进而恢复数据库。
4.1.1 备份类型
- 全量备份:备份数据库中所有数据(完整副本),恢复简单但占用空间大、耗时久。
- 增量备份:仅备份上次备份(全量或增量)后变化的数据,节省空间但恢复时需按顺序叠加。
- 差异备份:仅备份上次全量备份后变化的数据,恢复时只需全量 + 最新差异,比增量更简单。
4.1.2 备份方式
- 逻辑备份:通过 SQL 语句导出数据,生成可读的文本文件,跨平台性好但速度较慢。
- 物理备份:直接复制数据库的物理文件(如数据文件、日志文件),速度快但与数据库版本 / 平台相关。
4.2 mysqldump
4.2.1 全量备份
# 使用mysqldump备份单个数据库(含结构和数据)
mysqldump -u 用户名 -p --databases 数据库名 > 备份文件.sql
# 示例:备份名为mydb的数据库到20250924_backup.sql
mysqldump -u root -p --databases mydb > /backup/20250924_backup.sql# 备份所有数据库
mysqldump -u root -p --all-databases > /backup/full_backup.sql
4.2.2 增量备份(需开启二进制日志)
# 1. 开启二进制日志(在my.cnf中配置)
log_bin = /var/lib/mysql/mysql-bin.log# 2. 全量备份后,记录当前日志位置
mysqldump -u root -p --databases mydb --flush-logs --master-data=2 > /backup/full_backup.sql
# --flush-logs:生成新的二进制日志文件,后续变更会记录到新文件# 3. 增量备份(复制新增的二进制日志)
cp /var/lib/mysql/mysql-bin.000002 /backup/increment_1.sql
4.2.3 恢复操作
在MySQL中我们采用的是逻辑备份,所以恢复操作本质上是将备份文件导入到数据库。
(1)在操作系统命令行(非 MySQL 交互模式)执行
打开终端(Linux/macOS)或命令提示符(Windows),直接运行以下命令(不要先进入 mysql> 交互模式):
mysql -u root -p -e "CREATE DATABASE IF NOT EXISTS 数据库名称;"mysql -u 用户名 -p 数据库名 < SQL文件路径
执行后会提示输入密码(输入你的 MySQL 密码),然后自动将SQL文件中的内容导入到数据库。
(2)在 MySQL 交互模式中使用 SOURCE 命令
- 先登录 MySQL:
mysql -u 用户名 -p
- 创建要恢复的数据库:
CREATE DATABASE IF NOT EXISTS 数据库名称;
- 切换到目标数据库:
USE 数据库名称;
- 使用 SOURCE 命令导入 SQL 文件(需要写全文件路径,绝对路径或相对路径均可):
SOURCE SQL文件路径;
4.3 利用备份修改数据库名称
利用 MySQL 自带的备份工具 mysqldump,通过备份旧库、恢复到新库的方式实现重命名:
- 备份旧数据库到 SQL 文件:
# 命令行执行(需替换用户名、旧库名) mysqldump -u 用户名 -p 旧数据库名 > 备份文件.sql
创建新数据库:
CREATE DATABASE IF NOT EXISTS 新数据库名 CHARACTER SET = 旧库字符集 COLLATE = 旧库排序规则;
将备份文件恢复到新数据库:
# 命令行执行(需替换用户名、新库名、备份文件名) mysql -u 用户名 -p 新数据库名 < 备份文件.sql
DROP DATABASE 旧数据库名:
DROP DATABASE 旧数据库名;
注意事项与之前的方法相同。