mysql无符号整型溢出

下午用sql的时候突然想到这个问题,徒手测试了一下,结果还真令人意外:

首先创建一张测试用表

mysql> CREATE TABLE `t1` (
-> `id`  int UNSIGNED NOT NULL AUTO_INCREMENT ,
-> `val`  int UNSIGNED NOT NULL DEFAULT 0 ,
-> PRIMARY KEY (`id`)
-> );
Query OK, 0 rows affected (0.04 sec)

初始化一条数据:

mysql> insert into t1(val) values(0);
Query OK, 1 row affected (0.00 sec)

查看结果:

mysql> select * from t1;
+----+-----+
| id | val |
+----+-----+
|  1 |   0 |
+----+-----+
1 row in set (0.00 sec)

进行溢值计算:

mysql> update t1 set t1.val = t1.val - 1;
Query OK, 1 row affected, 1 warning (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 1

产生了一个警告,查看下当前结果:

mysql> select * from t1;
+----+------------+
| id | val        |
+----+------------+
|  1 | 4294967295 |
+----+------------+
1 row in set (0.00 sec)

这个结果不难推测:0-1=-1,而-1(int)刚刚好是2^32-1. 将val置0:

mysql> update t1 set t1.val = 0;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

查看当前数据:

mysql> select * from t1;
+----+-----+
| id | val |
+----+-----+
|  1 |   0 |
+----+-----+
1 row in set (0.00 sec)

进行溢值计算:

mysql> update t1 set t1.val = t1.val - 2;
Query OK, 1 row affected, 1 warning (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 1

猜猜结果是多少?

mysql> select * from t1;
+----+------------+
| id | val        |
+----+------------+
|  1 | 4294967295 |
+----+------------+
1 row in set (0.00 sec)

为什么不是2^32-2呢?暂时不知道原因

再进行一个溢值操作:

mysql> update t1 set t1.val = t1.val + 1;
Query OK, 0 rows affected, 1 warning (0.00 sec)
Rows matched: 1  Changed: 0  Warnings: 1

可以看到Changed: 0,查看下数据:

mysql> select * from t1;
+----+------------+
| id | val        |
+----+------------+
|  1 | 4294967295 |
+----+------------+
1 row in set (0.00 sec)

很有意思.记录一下

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏文渊之博

比较列存储索引与行索引

原因:     之前已经写过一篇关于列存储索引的简介https://cloud.tencent.com/developer/article/1032222,很粗...

1876
来自专栏java一日一条

MySQL分页性能优化指南

很多应用往往只展示最新或最热门的几条记录,但为了旧记录仍然可访问,所以就需要个分页的导航栏。然而,如何通过MySQL更好的实现分页,始终是比较令人头疼的问题。虽...

813
来自专栏邵梦超的专栏

Mysql 并发引起的死锁问题

平台的某个数据库上面有近千个连接,每个连接对应一个爬虫,爬虫将爬来的数据放到cdb里供后期分析查询使用。前段时间经常出现cdb查询缓慢,cpu占有率高的现象。难...

1.2K0
来自专栏杨建荣的学习笔记

关于all_procedures的问题分析 (r9笔记第61天)

今天快下班的时候有一个同事问我一个存储过程的权限是否做过修改。我简单看了下发现这个滚出过程已经是很久以前创建的了,一直没有做过修改,所以就反馈给 他了。但是他过...

3326
来自专栏杨建荣的学习笔记

关于奇怪的并行进程分析(三)(r6笔记第47天)

在前两篇的基础上,对于一个环境中存在的奇怪并行进程问题进行了初步的分析。 初步排除了是通过scheduler的job运行导致的,一方面因为运行的时间会有延迟,甚...

2714
来自专栏杨建荣的学习笔记

一个SQL性能问题的优化探索(二)(r11笔记第38天)

继续前几天的一个案例一个SQL性能问题的优化探索(一)(r11笔记第33天) 如下的SQL语句存在索引字段CARD_NO,但是执行的时候却走了全表扫描,因为这是...

3388
来自专栏逸鹏说道

维护索引(3)——通过重建索引提高性能

前言: 重建一个索引只是在内部删除并重建索引,使得碎片消失、统计信息更新、物理顺序重新排列组织。它会压缩数据页,按照填充因子填充适当的数据。如果有需要,也会添加...

2364
来自专栏杨建荣的学习笔记

物化视图相关的性能改进 (r7笔记第58天)

今天早上开发的一个同事找到我说他早上做了一个统计查询,但是感觉速度很慢,已经过了一个小时了还没有反应。想让我看看是什么情况。 我通过v$session查到有一个...

3275
来自专栏java一日一条

MySQL分页性能优化指南

很多应用往往只展示最新或最热门的几条记录,但为了旧记录仍然可访问,所以就需要个分页的导航栏。然而,如何通过MySQL更好的实现分页,始终是比较令人头疼的问题。虽...

723
来自专栏IT大咖说

2018年,让你的数据库变更快的十个建议

摘要 大多数网站的内容都存在数据库里,用户通过请求来访问内容。数据库非常的快,有许多技巧能让你优化数据库的速度,使你不浪费服务器的资源。在这篇文章中,我收录了十...

4017

扫码关注云+社区