MySQL 的版本实际使用来说,mysql5.6 mysql5.7 mysql8.0 是大家目前使用最多的版本,而这三个版本之间有什么别较大的区别呢,个人总结如下:

1.group by

在mysql 5.7之后,mysql group by的默认使用增加了限制,一些在mysql5.6可以执行的group by,在5.7 之后会报错,如果不想修改sql 语句的话,那么可以更改一下 mysql5.7 或者mysql 8.0 的sqlmodel

方式一:重启mysql后失效

其中如果 8.0执行可能报错部门模式 已经不支持,删除对应不支持的模式设置即可

//查询sql_mode
SELECT @@SESSION.sql_mode;

//设置
SET GLOBAL sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'; 
//设置
SET SESSION sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';

//刷新
flush PRIVILEGES;

最新版本的mysql8+的数据库 sqlmodel 已经没有NO_ENGINE_SUBSTITUTION 如果配置报错,去除相关模式

方式二:

配置mysql配置文件添加 sql_mode = '对应需要模式';

sql_mode 模式说明:


ONLY_FULL_GROUP_BY
对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么这个SQL是不合法的,因为列不在GROUP BY从句中

NO_AUTO_VALUE_ON_ZERO
该值影响自增长列的插入
默认设置下,插入0或NULL代表生成下一个自增长值。如果用户希望插入的值为0,而该列又是自增长的,那么这个选项就有用了。

STRICT_TRANS_TABLES
在该模式下,如果一个值不能插入到一个事务中,则中断当前的操作,对非事务表不做限制

NO_ZERO_IN_DATE
在严格模式下,不允许日期和月份为零 

NO_ZERO_DATE
设置该值,mysql数据库不允许插入零日期,插入零日期会抛出错误而不是警告

ERROR_FOR_DIVISION_BY_ZERO
在insert或update过程中,如果数据被零除,则产生错误而非警告。如果未给出该模式,那么数据被零除时Mysql返回NULL

NO_AUTO_CREATE_USER
禁止GRANT创建密码为空的用户

NO_ENGINE_SUBSTITUTION
如果需要的存储引擎被禁用或未编译,那么抛出错误。不设置此值时,用默认的存储引擎替代,并抛出一个异常

PIPES_AS_CONCAT
将"||"视为字符串的连接操作符而非或运算符,这和Oracle数据库是一样是,也和字符串的拼接函数Concat想类似

ANSI_QUOTES
启用ANSI_QUOTES后,不能用双引号来引用字符串,因为它被解释为识别符
————————————————
原文链接:https://blog.csdn.net/qq_15957557/article/details/110281847


2.mysql8.0修改了账号密码加密策略

mysql8.0 的账号密码默认登陆策略和之前的不同,导致一些可视化软件无法连接mysql8.0版本的数据库

那可以修改一下mysql8.0 的默认是用策略,或者账号密码的认证策略

方式一:

配置文件添加

default_authentication_plugin=mysql_native_password

让mysql 使用原密码策略

方式二:

执行语句修改某账号密码验证策略

ALTER USER '账号'@'%' IDENTIFIED WITH mysql_native_password BY '密码'

3.mysql8.0 授权用户账号语法区别

创建用户的操作已经不支持grant的同时创建用户的方式,需先创建用户再进行授权
mysql> grant all on *.* to 'admin'@'%' identified by 'admin';

ERROR 1064 (42000):

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'identified by 'admin'' at line 1

正确流程:

mysql> create user 'admin'@'%' identified by 'admin';

mysql> grant all on *.* to 'admin'@'%' ;

mysql> flush privileges;

4.springboot jdbc连接数据库区别

1.首先8.0 需要驱动使用 8.0对应连接的驱动,springboot2.0+版本自动集成了8.0+版本,只需要对应依赖正确即可

2.高版本的默认jdbc驱动类从 com.mysql.jdbc.Driver  改成 com.mysql.cj.jdbc.Driver 虽然springboot 启动不会影响,但是会提示你这个问题

3.jdbc 连接串修改如下

jdbc:mysql://{ip}:{port}/{db}?characterEncoding=utf8&useSSL=false&serverTimezone=UTC

useSSL  如果不配置false 项目可以正常启动但是会提示ssl问题

serverTimezone=UTC 必须配置【时区设置成自己对应的时区】否则项目会报错

java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more 


 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐