MySQL 的版本实际使用来说,mysql5.6 mysql5.7 mysql8.0 是大家目前使用最多的版本,而这三个版本之间有什么别较大的区别呢,个人总结如下:
在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
mysql8.0 的账号密码默认登陆策略和之前的不同,导致一些可视化软件无法连接mysql8.0版本的数据库
那可以修改一下mysql8.0 的默认是用策略,或者账号密码的认证策略
方式一:
配置文件添加
default_authentication_plugin=mysql_native_password
让mysql 使用原密码策略
方式二:
执行语句修改某账号密码验证策略
ALTER USER '账号'@'%' IDENTIFIED WITH mysql_native_password BY '密码'
创建用户的操作已经不支持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;
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