0


MySQL库的操作『增删改查 ‖ 编码问题 ‖ 备份与恢复』

✨个人主页:****北 海
🎉所属专栏:****MySQL 学习
🎃操作环境:****CentOS 7.6 阿里云远程服务器
🎁软件版本:****MySQL 5.7.44

成就一亿技术人


文章目录


1.创建数据库

创建数据库的语法为

CREATEDATABASE[IFNOTEXISTS] database_name;
[ ]

中的关键字可以选择不加,

IF NOT EXISTS

的意思是如果不存在才创建 数据库

登录

MySQL

后输入指令进行创建

mysql>createdatabaseifnotexists db1;
MySQL

中的语法不区分大小写,语法中通常 将关键字写成大写,方便学习和查看


注意:**如果数据库已存在,再次创建会报错,可以通过

if not exists

关键字将报错降低为警告**

Linux

中创建数据库的本质就是 **在

/var/lib/mysql

目录下创建了一个目录**

进入

db1

目录,可以看到里面只有一个后缀为

.opt

的配置文件

通过

cat

指令查看其中的类型,可以发现默认只有 **字符

character

** 和 **校对

collation

** 相关的配置信息,这俩其实就是 字符集检验集,用于设置 数据库 中的编码规则

为什么要设置编码?

因为 数据库 是用来存放 的,而 是用来存放内容的,内容又是以不同编码格式存储的,所以需要先确定 数据库 中的编码规则,才能确保后续能正常使用


2.数据库中的编码问题

2.1.字符集与校验集

MySQL

中与编码相关的主要是 字符集校验集

字符集 用于规定未来存储时的编码格式

校验集 则是规定数据查询时的校验规则

查看

MySQL

所有关于默认 字符集校验集 的使用情况

mysql>show variables like'character_%';

mysql>show variables like'collation_%';

注:**

%

MySQL

表示匹配一个或任意多个字符,类似于

Linux

中的

*

**

其中 字符集 的使用涵盖了 客户端、连接、数据库、文件系统、结果、服务端、系统、目录校验集 则主要用于 连接、数据库、服务端

主要都是使用

utf8

作为 字符集

utf8_general_ci

作为 校验集

**校验集

utf8_general_ci

** 是适用于

utf8

的一种校验规则,除此之外还有其他校验规则(后面说)


接下来查看 数据库 默认使用的 字符集编码集

mysql>show variables like'character_set_database';

mysql>show variables like'collation_database';

当前

MySQL

对于数据库的默认 字符集

utf8

,这是因为之前安装

MySQL

时在配置文件

my.cnf

设置的默认字符集就是

utf8

;默认的 校验集 则是

utf8_general_ci

以上是创建 数据库 时默认使用的 字符集校验集,如果想要查看具体某个 数据库 的编码使用情况,可以

cd

/var/lib/mysql

目录中,在进入具体的数据库目录,查看后缀为

.opt

的配置文件信息即可

2.3.支持的字符集与校验集

MySQL

支持很多 字符集,通过指令查看

mysql>showcharset;


几乎所有主流 编码 它都支持,接下来看看支持的 校验集

mysql>show collation;

截图过长,只截取了部分

一种 字符集 可以有多种 校验集,所以这张表会很大,不同的 校验集 的校验规则有所不同,比如

utf8_general_ci

utf8_bin

的区别在于 是否忽略大小写

utf8_general_ci

是忽略大小写的,而

MySQL

服务端使用的 校验集 正是

utf8_general_ci

,这也就是解释了为什么在

MySQL

中输入指令可以忽略大小写;至于

utf8_bin

区分大小写,这两种 校验集 的演示放在后面细谈

2.4.自由设置字符集与校验集

配置文件

my.cnf

中设置的 字符集 配置信息就像一个 “缺省值”,如果用户不指定,就使用默认的,如果用户指定了,就优先使用用户指定的 字符集校验集 也是如此

注意:校验集要能适用于字符集,否则会导致无法创建

创建 数据库 时指定编码相关信息的语法如下

CREATEDATABASE[IFNOTEXISTS] database_name [CHARSET=xxx |CHARACTERSET xxx][COLLATE xxx]

**

|

表示存在多种写法,可以任意选择其中一种**

接下来演示创建 数据库 时指定 字符集校验集

这里指定字符集为

gbk

,校验集为

gdk_chinese_ci
mysql>createdatabaseifnotexists db2 charset=gbk collate gbk_chinese_ci;// 或者

mysql>createdatabaseifnotexists db2 characterset gbk collate gbk_chinese_ci;



如果只指定 字符集 或者 校验集 可以成功创建吗?

可以的,会根据 字符集 或者 校验集 推导出它的另一半

那如果指定毫不相关的 字符集校验集 能成功创建 数据库 吗?

不行,会直接报错的,既然校验规则不适用,创建了也没意义,这就好比你往语文卷子上写英语,语文老师大概率是看不懂的,并且不会批改你的卷子

总之,

MySQL

支持在创建 数据库 时自由设置 字符集校验集,只指定其中一方也能成功创建,因为

MySQL

可以进行推导,但如果指定的 字符集校验集 没有关系,是无法创建 数据库 的,根据实际情况灵活设置

2.2.校验集对查询的影响

一个 字符集 拥有多个 校验集,也就意味着可以使用不同的校验规则,接下来演示

utf8_general_ci

utf8_bin

这两种不同的 校验集 对查询的影响

首先创建一个 校验集

utf8_general_ci

数据库,随后创建一张 ,并向 中插入多条数据,然后条件查询其中的结果

mysql>createdatabaseifnotexists test1 collate utf8_general_ci;

mysql>use test1;

mysql>createtable t (name varchar(32));

mysql>insertinto t values('a');
mysql>insertinto t values('A');
mysql>insertinto t values('b');
mysql>insertinto t values('B');
mysql>insertinto t values('c');
mysql>insertinto t values('C');

mysql>select*from t1 where name='a';

注意:**在对数据库进行操作前,需要先

use database_name

指明数据库**

执行结果如下


注:**

where

是条件查询语句,可以用来指定查看规则,这里的

where name='a'

是查询

t

表中

name

a

的行信息**

可以看到最终查询结果为

a

A

,明明只要求

name='a'

,但最终查出来

A

,这是因为

utf8_general_ci

校验集 在进行校验时,是 不区分大小写

接下来看看

utf8_bin

校验集 对查询的影响

同样的创建数据库、创建表、插入数据、查询结果

mysql>createdatabaseifnotexists test2 collate utf8_bin;

mysql>use test2;

mysql>createtable t (name varchar(32));

mysql>insertinto t values('a');
mysql>insertinto t values('A');
mysql>insertinto t values('b');
mysql>insertinto t values('B');
mysql>insertinto t values('c');
mysql>insertinto t values('C');

mysql>select*from t1 where name='a';

可以看到,当 校验集

utf8_bin

时,查询结果是 区分大小写 的,最终查出了

a

这行数据

这里想说的是 **不同校验集对查询结果是有差异的,需要结合具体业务场景选择校验集,编码集也是如此,不过一般情况下都不需要指定,使用默认的

utf8

utf8_general_ci

就行了**


3.查看数据库

可以查看当前

MySQL

中已经创建了哪些 数据库

mysql>showdatabases;

当然也可以直接去

/var/lib/mysql

目录中查看

cd /var/lib/mysql

ll

存在这么多 数据库,如何知道自己当前处于哪个数据库中?

通过

database()

函数查看,这是一个函数,可以用于查看当前所处 数据库(个人猜测是调用了显示当前所处路径的相关接口实现)

mysql>selectdatabases();

可以看到当前处于

test2

数据库中

如何查看 数据库 创建时的详细信息?

可以通过

show

进行查看,这里看看

test2

的创建信息

mysql>showcreatedatabase test2;// 或者

mysql>showcreatedatabase test2 \G

在后面加上

\G

是为了格式化显示,让显示结果更加清晰

可以看到创建

test2

时的详细信息,比如指定的 字符集编码集

/*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_bin */

是什么意思?
**这是句话是为了确保兼容性,因为在

MySQL 4.1

之前,是无法在创建数据库时指定字符集和校验集的。所以这句话的意思是 如果

MySQL

版本高于

4.1

就加上这句话(创建字符集和校验集),否则就不加**


4.修改数据库

数据库 可以修改很多东西(不只是编码格式),修改相关的语法如下

修改数据库名(

MySQL 5.1.23

之前的版本适用)

RENAMEDATABASE old_name TO new_name;

出于安全考虑,这个语法在当前的

MySQL

中已经不被支持了,因为 数据库 更名后,上层应用在使用 数据库 时会受到影响,比较稳妥的更名方法是 备份数据、新建数据库(更名)、导入数据(还是不推荐改名)

数据库轻易不要删除,数据库轻易不要改名

修改编码格式

ALTERDATABASE database_name [alter_spacification [,alter_spacification]...];

之前的

test2

数据使用的是

utf8

utf8_bin

,现在将其修改为

gbk

gbk_chinese_ci
mysql>alterdatabase test2 charset=gbk collate gbk_chinese_ci;

除此之外,还可以修改 数据库所有者、启用/禁用数据库的自动提交等,这些东西需要结合后面的相关知识理解,这里就不再阐述


5.删除数据库

Linux

中,数据库 的本质就是一个 目录,因此 数据库 也是可以删除的,具体语法如下

DROPDATABASE[IFEXISTS] database_ name;

在这里

IF EXISTS

表示检查 数据库,存在才删除,删除不存在的 数据库 是会报错的,加了

IF EXISTS

后可以避免报错,转为警告

删除之前创建的数据库

执行删除之后的结果:

  • 数据库内部看不到对应的数据库
  • 对应的数据库文件夹被删除,级联删除(里面的数据表全部被删)

注意:不要轻易删除数据库,数据库删除后很难恢复


为了避免误删 数据库,通常需要将 数据库 进行备份


6.数据库的备份与恢复

有一种简单粗暴的备份方式:直接将对应的目录打包,需要使用时解压至指定目录即可

这种方式 严重不推荐,原因是恢复时可能会出现问题,假设恢复至版本更低的

MySQL

中,会出现各种奇怪的问题,毕竟老版本没有新特性,还有就是这种做法太暴力了

推荐使用

MySQL

提供的备份工具

mysqldump

进行备份,具体语法为

mysqldump -u 用户 -p-P 端口 -B 待备份的数据库 > 目标路径(含目标文件)

比如把之前创建的

test2

数据库进行备份

注意:如果有人在使用该数据库,需要先断开连接

mysqldump -u root -p-P8080-B test2 > /home/Yohifo/MySQL/test2.sql

回车并输入密码后,对应的数据库就备份成功了

看看备份文件是什么内容

cat test2.sql

其实就是一些 数据库 的配置信息 + 执行过的

SQL

语句


有备份就有恢复,恢复的语法如下

mysql> SOURCE 路径;

接下来先删除

MySQL

中的

test2

数据库

mysql>showdatabases;

mysql>dropdatabaseifexists test2;

mysql>showdatabases;

然后从

Linux

中读取备份文件,并进行恢复

mysql> source /home/Yohifo/MySQL/test2.sql

一瞬间执行了很多条语句,并且都是成功状态,接下来查看是否存在

test2

数据库


数据库

test2

已经成功恢复,包括其中的 表中的数据 都已经恢复了

所以备份与恢复 数据库 还是比较简单的,只需要从

MySQL

中获取备份后的

sql

文件,可将该备份文件进行传输,其他

MySQL

客户端只需要

source

即可轻松恢复整个 数据库


可以只备份 数据库 中的 ,语法如下

mysqldump -u root -p-P 端口 -B 数据库名 表名1 > 目标路径(含文件)

也可以同时备份多个 数据库

mysqldump -u 用户 -p-P 端口 -B 数据库1 数据库2 数据库3 > 目标路径(含目标文件)

语法中的

-B

含义是什么?
**

-B

表示备份时,将创建数据库的语句也进行了备份,恢复时可以一键恢复;但如果不加

-B

选项,恢复时就需要先创建数据库,再

use

数据库,然后才能

source

**


7.查看数据库的连接情况

MySQL

支持多用户访问,可以通过指令查看当前的使用情况

mysql>show processlist;

支持 本地连接远程连接(需要进行设置)

标签: mysql 数据库

本文转载自: https://blog.csdn.net/weixin_61437787/article/details/134399473
版权归原作者 北 海 所有, 如有侵权,请联系我们删除。

“MySQL库的操作『增删改查 ‖ 编码问题 ‖ 备份与恢复』”的评论:

还没有评论