Kongdom
(Kongdom)
1
为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
- 【TiDB 版本】:5.7.25-TiDB-v4.0.2
- 【问题描述】:
测试数据准备
创建测试表
CREATE TABLE tb_test
(
c_int
int(10) NULL DEFAULT NULL
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin >ROW_FORMAT = Compact;
插入测试数据
INSERT INTO tb_test
(c_int
)
VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
tb_test是个测试表,字段c_int为int型,tb_test现有10条数据,记录为0、1、2、3、4、5、6、7、8、9,执行下列语句会报错
insert into tb_test(c_int)
select
case when c_int != 0 then 10/c_int else 0 end
from tb_test
明明已经用case when排除了分母为0的情况,还是报下面的错误
1365 - Division by 0
已经尝试过清空sql_mode,全局和会话都清空了,无效。
1 个赞
spc_monkey
(carry@pingcap.com)
2
没明白的问题是什么?报错的原因就是分母为 0 而已,这个动作和 SQL mode 的 设置有关系,具体可以百度一下,另外是否选择报错,看自己的业务,自行判断
Kongdom
(Kongdom)
3
问题是,我用了case when语句,排除了为0的情况,但是还是提示我存在分母为0
Kongdom
(Kongdom)
4
where中添加条件就不报错了,但是感觉case when的效果应该是一样的
insert into tb_test(c_int)
select
case when c_int != 0 then 10/c_int else 0 end
from tb_test
where c_int != 0
下面这种写法也不报错
insert into tb_test(c_int)
select
10/if(c_int=0,null,c_int)
from tb_test
Kongdom
(Kongdom)
5
我修改了描述,这样是否清晰。客户服务器上的sql_mode目前已经是空了。
Kongdom
(Kongdom)
6
已经按照网上描述的清空sql mode,全局和会话都清空了,还是提示这个。客户是生产环境,不能重启数据库。
我在 v4.0.8 版本中似乎没有复现这个问题
mysql> CREATE TABLE tb_test (
-> c_int int(10) NULL DEFAULT NULL
-> ) ;
Query OK, 0 rows affected (0.17 sec)
mysql> INSERT INTO tb_test(c_int)
-> VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
Query OK, 10 rows affected (0.11 sec)
Records: 10 Duplicates: 0 Warnings: 0
mysql> insert into tb_test(c_int)
-> select
-> case when c_int != 0 then 10/c_int else 0 end
-> from tb_test;
Query OK, 10 rows affected (0.07 sec)
Records: 10 Duplicates: 0 Warnings: 0
mysql> show variables like '%sql_mode%';
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
| Variable_name | Value |
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
| sql_mode | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.09 sec)
mysql> select tidb_version();
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tidb_version() |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Release Version: v4.0.8
Edition: Community
Git Commit Hash: 66ac9fc31f1733e5eb8d11891ec1b38f9c422817
Git Branch: heads/refs/tags/v4.0.8
UTC Build Time: 2020-10-30 08:21:16
GoVersion: go1.13
Race Enabled: false
TiKV Min Version: v3.0.0-60965b006877ca7234adaced7890d7b029ed1306
Check Table Before Drop: false |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.05 sec)
Kongdom
(Kongdom)
9
感谢,刚在本机测试了,确实v4.0.8版本不报错。。。在v4.0.0和v4.0.2版本是有这个问题。。。
那应该是一个已修复的 BUG ,可以考虑升级一下集群。
另外在 MySQL 中验证也有这个问题是在 MySQL 什么版本验证的?我在 MySQL 8.0.19 版本也没有复现这个问题。
Kongdom
(Kongdom)
11
短期是不能升级了,目前客户是v4.0.2版本。
mysql是5.7版本,因为第三方组件问题,我们这边给客户配套的mysql版本要求是5.7
Kongdom
(Kongdom)
关闭
13
此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。