mysql 报错 division by 0
2021/7/24 2:13:18
本文主要是介绍mysql 报错 division by 0,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
mysql 5.5升级到5.7的坑
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; 以上只是本人遇到的其中一个小问题,不同的环境不一样,希望能解决您的问题。
这篇关于mysql 报错 division by 0的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-04部署MySQL集群项目实战:新手入门教程
- 2024-11-04如何部署MySQL集群资料:新手入门指南
- 2024-11-02MySQL集群项目实战:新手入门指南
- 2024-11-02初学者指南:部署MySQL集群资料
- 2024-11-01部署MySQL集群教程:新手入门指南
- 2024-11-01如何部署MySQL集群:新手入门教程
- 2024-11-01部署MySQL集群学习:新手入门教程
- 2024-11-01部署MySQL集群入门:新手必读指南
- 2024-10-23BinLog入门:新手必读的MySQL二进制日志指南
- 2024-10-23Binlog入门:MySQL数据库的日志管理指南