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;

以上只是本人遇到的其中一个小问题,不同的环境不一样,希望能解决您的问题。
### PHPStudy 中 MySQL 报错问题分析 当遇到 PHPStudy 环境下 MySQL 启动失败的情况时,通常可能是由于多个原因引起的。以下是几种常见的解决方案: #### 1. 解决端口冲突问题 如果电脑上已经预先安装了 MySQL,则可能会发生端口冲突。即使尝试更改端口号也未能解决问题,这可能是因为新的端口配置并未生效或者存在其他潜在的冲突[^1]。 为了确认这一点,可以检查 `my.ini` 文件中的 `[mysqld]` 部分是否有正确的端口设置,并确保该端口确实处于可用状态。另外,通过命令行工具如 netstat 来验证指定端口是否已被占用也是一个不错的选择。 #### 2. 修改 SQL 模式 有时,默认的 SQL 模式可能导致某些语句执行失败从而引发错误。对于这个问题,可以在 `my.ini` 文件内的 `[mysqld]` 节点处添加特定参数来调整 SQL 行为模式: ```ini sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' ``` 此操作有助于消除因不兼容的数据处理方式所造成的异常情况[^3]。 #### 3. 清理残留数据和服务项 先前存在的 MySQL 安装程序可能留下了未完全清除的日志文件或其他资源文件;这些遗留物也可能干扰新实例的工作流程。建议卸载旧版 MySQL 并清理注册表以及 `%APPDATA%`, `%PROGRAMFILES%\MySQL` 下的相关目录后再重试启动服务。 此外,还需注意 Windows 的服务列表里是否存在重复的服务条目——如果有,请移除不必要的那一项以防止混淆。 #### 4. 更新或重新安装驱动器/组件 最后但同样重要的是,保持所有必要的软件包更新至最新版本往往能有效减少许多未知的技术难题。特别是数据库连接所需的客户端库和插件等部件应当及时升级维护。 ```bash # 使用管理员权限运行 PowerShell 或 CMD 执行以下命令可获取当前已安装 MySQL 版本信息 wmic product where "name like '%%MySQL%%'" get name,version /format:list ``` 以上措施综合运用可以帮助解决大部分关于 PHPStudy 内置 MySQL 组件无法正常工作的状况。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值