MYSQL 8.0新特性
默认字符集
查看MySQL数据库服务器和数据库MySQL字符集
1
show variables like '%char%';
下面是两个版本MySQL 5.7.33和MySQL 8.0.12下的字符集
character_set_server: 服务器安装时指定的默认字符集设定。
character_set_database: 数据库服务器中某个库使用的字符集设定,如果建库时没有指明,将使用服务器安装时指定的字符集设置。
在之前的版本创建数据库时候:create database db_name; 没有指定编码,会导致中文乱码问题。因为你不设置编码的话,就会使用他本身的默认字符集latin1。
窗口函数
窗口函数有点像是 SUM()、COUNT() 那样的集合函数,但它并不会将多行查询结果合并为一行,而是将结果放回多行当中。也就是说,窗口函数是不需要 GROUP BY 的。这样可以用来实现很多新的查询方式。
先看一下这个表
这里我们创造了一个窗口w,w是对Name正向排序。然后我们在select中对w执行了 rank() 方法,将结果输出为 rank 字段。
想了解更多可以去看看官方文档。
通用表表达式 (CTE)
可以让人更清楚的进行查询
之前的查询方式
1 | SELECT a1.*, a2.* FROM |
有CTE之后
1 | with |
如果哪里错误可以更清楚的了解错误位置,更方便修改。
持久化AUTO_INCREMENT值
在8.0版本之前,表的AUTO_INCREMENT值是存在内存中的,没有持久化到磁盘中,所以会出现这样的情况:
向表中插入3条记录,不指定id,则id自增为1,2,3。
删除id为3的行。
重启MySQL服务。
向表中插入一条记录,不指定id,则新增的这条记录的id将会是3,和之前一条记录的id重复。
但是我在使用5.7.26版本的时候,重复了操作,发现并没有出现这种bug。
删除第三个之后,重启MySQL,id依旧正常显示为4。
DDL原子化
这个简单理解就是,当同时操作时,如果第二个操作出现问题,那么第一个操作也不会被执行。
比如同时删除两个表 a1,a2如果a2删除出现问题,在之前的版本中最后的情况是a1被删除,a2报错
1 | DROP TABLE table2,table2; |
但是在8.0版本之后,系统会回滚到执行这个语句之前,即表1,表2都不会被删除
可以看到,在这里persons这个表是没有被删除的。
角色管理
这里把用户归结为一个个角色,这些角色都有相应的权限,这样就不需要为每一个用户单独设置权限了。创建用户之后,可以直接把他分到相应的角色里去即可。
1 | 创建角色 |
还有一些操作,可以看官方文档。
参数修改持久化
MySQL 的设置可以在运行时通过 SET GLOBAL 命令来更改,但是这种更改只会临时生效,到下次启动时数据库又会从配置文件中读取。
MySQL 8 新增了 SET PERSIST 命令
MySQL 会将该命令的配置保存到数据目录下的 mysqld-auto.cnf 文件中,下次启动时会读取该文件,用其中的配置来覆盖缺省的配置文件。
这个文件在phpstudy中是在MySQL对应版本下的data目录中的。