在MySQL5.7版本后mysql8.0部分sql语法报错问题
1.执⾏sql语句报错:variable ‘sql_mode’ can’t be set to the value of ‘NO_AUTO_CREATE_USER’
原因以及解决:8.0以上已经取消了NO_AUTO_CREATE_USER这个关键字,删掉sql语句中的这个关键字即可
2.执⾏sql语句:GRANT ALL PRIVILEGES ON . TO root@’%’ IDENTIFIED BY “123456”
报错:Error Code: 1064. 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 “123456”’ at line 1
原因以及解决:8.0以上 GRANT不在与IDENTIFIED BY 联⽤,去掉 IDENTIFIED BY “123456”即可
3.this is incompatible with sql_mode=only_full_group_by
set
@@GLOBAL.sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGIN
霹雳之道佛双流app⽇志输出:
安全控件如何安装在手机
Caused by: ptions.jdbc4.MySQLSyntaxErrorException: In aggregated query without GROUP BY,
expression #5 of SELECT list contains nonaggregated column 'pe'; this is incompatible with
sql_mode=only_full_group_by
这是因为随着MySQL版本更新带来的问题,在MySQL5.7版本之后对group by进⾏了优化。他默认启动改进之后的
版本启动了ONLY_FULL_GROUP_BY模式。
这种模式的官⽅解释:ONLY_FULL_GROUP_BY是MySQL数据库提供的⼀个sql_mode,通过这个sql_mode来保证
SQL语句“分组求最值”合法性的检查。这种模式采⽤了与Oracle、DB2等数据库的处理⽅式。即不允许select target list
中出现语义不明确的列。
通俗的讲就是:对于⽤到GROUP BY的select语句,查出来的列必须是group by后⾯声明的列,或者是聚合函数⾥⾯的列
有这样⼀个数据库的表
select语句:select id, sum(appr_id) from appr group by id------------------------------------(合法)停止内战一致对外的历史事件
select语句:select id, user_id, sum(appr_id) from appr group by id-------------------------(合法)
select语句:select id, sum(appr_id) from appr group by role----------------------------------(不合法)
select语句:select id, user_id, sum(appr_id) from appr group by role-----------------------(不合法)
mysql面试题sqlselect语句:select * from appr group by role-------------------------------------------------------(不合法)
经过⼤量测试:笔者发现了ONLY_FULL_GROUP_BY这种模式的特点:
1:只要有聚合函数sum(),count(),max(),avg()等函数就需要⽤到group by,否则就会报上⾯的错误。
2:group by id(id是主键)的时候,select什么都没有问题,包括有聚合函数。
3:group by role(⾮主键)的时候,select只能是聚合函数和role(group by的字段),否则报错
如果我们不想⽤⽤ONLY_FULL_GROUP_BY的模式。有两种解决这种问题的⽅案:
1:命令⾏中输⼊:
set @@GLOBAL.sql_mode='';
vb编程写小说
set sql_mode
='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_EN
不过这种情况治标不治本,⼀旦mysql重启之后⼜会恢复。
2:修改MySQL的配置⽂件,
1、windows下到MySQL的安装⽬录的my.ini⽂件,修改其中的配置为不启动ONLY_FULL_GROUP_BY模式
删掉带有ONLY_FULL_GROUP_BY的模式就ok了,如果没有到my.ini⽂件。
去系统的隐藏⽂件夹查看,在某个盘下输⼊%ProgramData%然后搜索MySQL的my.ini⽂件
2、linux下到myf⽂件,这个是配置MySQL的⽂件。⼀般这个⽂件是在etc⽂件夹下。
vi myf 编辑这个⽂件,然后在图⽰的位置上加⼊sql_mode =
"STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FO
R_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER"
作业汇编怎么写的
然后重启MySQL服务:service mysqld restart

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。