mysql 5.5升级到5.7后对数据库的要求更加严格了,所以我们在升级之后的一系列的操作都会失败。
具体有哪些sql_mode发生变化,我们可以查询
select @@global.sql_mode;//查询全局的sql_mode, select @@sql_mode;//查询补充系统变量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后,不能用双引号来引用字符串,因为它被解释为识别符
这边因我的存储过程中的update语句中有分母为0的情况,所以升级到5.7之后存储过程的执行就会一直出现 division by 0的错误,一开始想出来了2个解决方案: 1.给分母上加上nullif(param1,param2)的函数 nullif的意思是,如果param1=param2,那么返回为true,这个结果返回为null 否则的话返回的是param1的内容 这种方案虽然能解决问题,但是改起来太慢了,如果存储过程很多的话,又是重复工作量。 2.修改sql_mode 因为数据库是放在linux上,但是用docker部署的,因为不知道mysql的映射的配置文件,所以很尴尬,只能 在navicat这边用语句处理,mysql一旦重启后就失效了。 linux版的话修改下mysql.cnf文件,在文件中加入sql_mode的设置。 windows版的话修改下my.ini文件,在文件中加入sql_mode的设置。 这里设置完之后都要重启才能生效。 如果没法修改配置文件,我们在navicat中,执行语句也可以的 (1)可以直接设置sql_mode为空 set sql_mode=“”; set @@global.sql_mode =“”; flush privileges; (2)可以将sql_mode设置为非严格模式 set sql_mode=“ANSI”; set @@global.sql_mode =“ANSI”; flush privileges; 以上只是本人遇到的其中一个小问题,不同的环境不一样,希望能解决您的问题。