目录
数据库服务器、数据库和表的关系
连接服务
库的操作
查看数据库
编码格式
编码集
校验集
查看支持的规则
查看系统默认规则
查看默认编码集
查看默认校验集
查看各种服务的默认校验集
创建数据库
if not exists
指定格式创建数据库
设置编码集
设置校验集
不同校验集的影响
编辑
示例
查看创建数据库时使用的命令
/*!40100 default.... */
数据库中数据存放位置
数据库本质
反过来操作
删除数据库
选择数据库
本质
查看当前选择的数据库
修改数据库
如果显示没有权限
备份数据库
本质
-B
恢复数据库
本质
查看数据库连接情况
总结
数据库服务器、数据库和表的关系
如图:
(其中, DB指的是数据库)
- 所谓安装数据库,只是在机器上安装了一个数据库管理系统程序,这个管理程序可以管理多个数据库,一般开发人员会针对每一个应用创建一个数据库
- 为保存应用中实体的数据,一般会在数据库中创建多个表,以保存程序中实体的数据
所以,我们首先需要连接上mysql
连接服务
- 如果不指定,就会使用配置文件中的默认选项
之前我们的root用户并没有设置密码,所以登录时不需要-p:
接下来,介绍对库的操作
库的操作
查看数据库
show databases
- 查看所有拥有的数据库
- 注意这里是复数(因为一般会有多个)
在介绍创建数据库之前,我们先要了解一下编码集和校验集的概念
编码格式
编码集
存储时采用的编码格式
校验集
进行增删改查时,进行字段比较时使用的编码格式,也就是读取数据库内容时采用的编码方式
(存储用什么格式,读取就得用一样的格式,不然读不懂)
查看支持的规则
show charset
它会给出支持的编码集以及对应的校验集
show collation
它会给出支持的校验集和对应的编码集,以及其他属性
查看系统默认规则
查看默认编码集
show variables like 'character_set_database'
查看默认校验集
show variables like 'collation_database'
查看各种服务的默认校验集
show variables like 'collation_%'
创建数据库
create database + (if not exists) + 库名 + 属性
if not exists
- 用于保证用户不会创建同名数据库
- 如果已经存在,会有一个警告
指定格式创建数据库
设置编码集
- charset = 格式名
- character set 格式名
设置校验集
- collate 格式名
- collate = 格式名
如果不手动设置,会使用配置文件中的默认编码格式
不同校验集的影响
- 从前面可以看到,我们的默认校验集是utf8_general_ci,它是不区分大小写的
- 那么我们再创建一个使用utf8_bin校验集的数据库d1 (它可以区分大小写)
示例
- 我们建立一个表,插入一些数据,来看看,不同的校验集对数据搜索的结果有何影响
- 分别在两个数据库中建立相同的表,然后在表中插入a和A字符:
- 分别在两个数据库的表中搜索a,会发现,出现的结果不同:
- 我们这样就验证出了,不同的校验集,会对查询结果产生影响
- 所以,我们在选择校验集时,需要仔细考虑我们的使用场景
查看创建数据库时使用的命令
show create database + 库名
/*!40100 default.... */
这个不是注释,它表示当前mysql版本如果大于4.01版本,就执行后面的语句
如果加上\G选项(还记得吗,是用来格式化显示的):
数据库中数据存放位置
通过查看我们的mysql配置文件 -- /etc/my.cnf
- 我们可以看到,有一个datadir,它就代表了存放mysql数据文件的路径
- 查看这个路径下的文件:
- 我们会发现,它里面的标蓝色的文件名,怎么正好和我们拥有的数据库名字相同呢?
数据库本质
- 因为,标蓝色就代表这个文件是个目录文件
- 所以,我们创建数据库,本质上其实就是在mysql专门保存数据的目录下,创建了个目录文件
- 所以,数据库本质上也是个文件
反过来操作
那如果我们直接在/var/lib/mysql下创建一个目录,会怎么样呢?
会发现,反过来操作也是可以的
但是!!!!可以不代表它合理!
- 既然我们数据库的底层依靠了文件系统,那么我们就不应该反过来操作,老老实实使用它规定的sql语句即可,不然它被设计出来是为了什么呢?
- 了解底层,是为了让我们更好的理解它,从而使用它,而不是越过它直接操作底层
删除数据库
drop database + 库名
删除数据库的操作一定要慎重,删除了数据库,相应的数据也会被删除
选择数据库
use + 库名
- 从前面介绍的这个关系图可以知道,一个数据库可以对应多个表
- 那么,如果我们要对表进行操作,肯定要先选择某个数据库
本质
- 从前面介绍的,数据库的本质是目录文件,可以判断出 -- 选择数据库,本质上就是选择进入哪一个目录
- 那么,我们自然也可以推出,表其实就是普通文件
- 毕竟我们在目录中操作的,肯定就是普通文件了
查看当前选择的数据库
select database()
(有时候我们可能会忘记自己当前选择了哪个数据库)
修改数据库
alter database + 库名 + 要修改的属性
如果显示没有权限
其实是因为,在mysql数据存放的路径下,这个目录的拥有者是root,而不是mysql用户
我们修改权限后,就可以正常使用了:
我们可以修改d2的编码集:
备份数据库
mysqldump -p 3306 -u root -p 密码 -B 数据库名 > 数据库备份存储的文件路径
- 需要我们手动设置生成的.sql文件:
- 注意,这里是在shell下执行的,而不是在mysql服务中
- 使用相对路径也可:
本质
保存了历史对数据库的有效操作
- 当我们查看生成的.sql文件的内容:
- 会发现它文件的内容,正是我们曾经对这个数据库的一系列操作
- 说明,mysql会记录下我们的历史操作,并且在进行备份时,将记录的数据写入./sql文件
- 那么,自然也可以推断出,恢复数据库的原理就是 -- 重新执行一遍记录下的操作
-B
- 如果我们不使用-B选项,会发现,在我们建表之前,并没有建立数据库和选择该数据库的语句
- 而使用了-B选项的d2.sql文件是记录了的
说明,如果不使用-B选项,恢复数据库时,需要我们手动建库和选择库
恢复数据库
source + 要恢复的./sql文件所在路径
本质
前面已经分析了,恢复数据库的原理就是 -- 重新执行一般.sql文件记录的操作
既然重新执行了一遍,自然数据库就和原来的一样了,也就实现了恢复数据库
查看数据库连接情况
show processlist
可以查看,当前的数据库有几个用户正在连接:
总结
- 以上工作,均是由mysql做的,我们只是通过mysql语句下达了指令
- 所以,数据库实际上就是一堆文件,只是这些文件不由我们直接操作,是数据库服务帮我们去操作的