当前位置: 首页 > news >正文

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_cici 表示 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. 创建新数据库
  2. 将旧数据库中的表逐个迁移到新数据库
  3. 确认数据无误后删除旧数据库
-- 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 命令

  1. 先登录 MySQL:
    mysql -u 用户名 -p
    输入密码后进入 mysql> 交互模式。
  2. 创建要恢复的数据库:
    CREATE DATABASE IF NOT EXISTS 数据库名称;
  3. 切换到目标数据库:
    USE 数据库名称;
  4. 使用 SOURCE 命令导入 SQL 文件(需要写全文件路径,绝对路径或相对路径均可):
    SOURCE SQL文件路径;

4.3 利用备份修改数据库名称

利用 MySQL 自带的备份工具 mysqldump,通过备份旧库、恢复到新库的方式实现重命名:

  1. 备份旧数据库到 SQL 文件:
    # 命令行执行(需替换用户名、旧库名)
    mysqldump -u 用户名 -p 旧数据库名 > 备份文件.sql
  2. 创建新数据库:

    CREATE DATABASE IF NOT EXISTS 新数据库名 CHARACTER SET = 旧库字符集 COLLATE = 旧库排序规则;
  3. 将备份文件恢复到新数据库:

    # 命令行执行(需替换用户名、新库名、备份文件名)
    mysql -u 用户名 -p 新数据库名 < 备份文件.sql
  4. DROP DATABASE 旧数据库名:

    DROP DATABASE 旧数据库名;

注意事项与之前的方法相同。

http://www.dtcms.com/a/403856.html

相关文章:

  • 文创网站江西合创建设工程有限公司 网站
  • 【Leetcode hot 100】124.二叉树中的最大路径和
  • 仙桃做网站找谁优化大师怎么卸载
  • 网站用户模板做网站需要的东西
  • 自定义类型之联合体、枚举
  • 计算机——信息素养和信息安全
  • php 整个网站变量实惠的制作网站
  • 不同路劲 III dfs解决
  • 海沧网站建设如何做好网站首页
  • PHP女程序猿学习Java的Day-12
  • 电商运营如何提升自身技能素质?
  • 网站开发四川网站的用户运营值得做吗
  • Android中开一个线程是ULT还是KLT
  • 动态IP的适用业务场景
  • 可以不使用备案的网站名吗网页制作网站知识
  • 怎么在百度搜索自己的网站做网站 分工
  • 符合系统国产化从mysql数据库迁移到达梦数据库需要注意的点有哪些?
  • 个人网站代码模板帝国cms网站建设
  • QML学习笔记(十二)QML的自定义组件
  • 做品牌网站找谁php网站开发视频网站
  • TESLAGLOVE为虚拟现实训练提供真实触觉反馈
  • 无锡微网站制作注册网站多久
  • HarmonyOS 5 高级动效实战:粒子系统、路径动画与物理动效开发
  • HarmonyOS 6 值得关注的核心新特性
  • FPGA实现双目摄像头红蓝3D融合,提供6套工程源码和技术支持
  • 仙游网站建设有没有好网站推荐
  • 网站如何备案 流程wordpress对接微信
  • Linux中修改主机名并立即生效的完整指南
  • Python常见的排序算法及其特点和实现代码
  • 网站备案号官网深圳全胜专业网站建设