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 条评论
登录 后参与评论

相关文章

来自专栏IT开发技术与工作效率

MySQL用注释当表头

893
来自专栏SpringBoot

MySQL避免插入重复记录:唯一性约束

844
来自专栏MYSQL轻松学

MYSQL常用SQL汇总

1、查看当前应用连接,连接数突增排查 select user,SUBSTRING_INDEX(host,':',1) as ip , count(*) as c...

3256
来自专栏开源项目

Git 项目推荐 | 分布式系统唯一 ID 生成方法

image.png 在工程中引用sequence项目的sequence-client jar包 在的应用数据库中创建两个sequence表,sql语句如下:...

31411
来自专栏互联网杂技

外键约束

外键约束 foreign key 外键约束的要求: 父表和字表必须使用相同的存储引擎,禁止使用临时表; 数据库引擎只能是InnoDB; 外键列和参照列必须具有...

3439
来自专栏数据和云

运维技巧 - 活用临时表隔离冷热数据

编辑手记:Oracle给了我们很多工具,在日常数据库管理中活用这些工具方可发挥最大效能。 作者简介: 张洪涛 富士康 DBA 在数据库监控过程中发现考勤数据...

3485
来自专栏数据库新发现

CTAS、Nologging以及数据库运行模式

http://www.itpub.net/showthread.php?threadid=242761

774
来自专栏开源优测

SQL常用的基础语法

SQL常用的语法 本文主要分享SQL日常使用过程中常用的语法样式。 在sql语句中,主要的关键词有SELECT、INSERT、UPDATE、DELETE、ALE...

3108
来自专栏跟着阿笨一起玩NET

SET XACT_ABORT各种用法及显示结果

  2、每个语句作为一个事务,事务在错误行终止,错误行回滚,错误行之前的不回滚,格式为:

812
来自专栏WindCoder

MySQL中INSERT INTO SELECT的应用

这种方法常用在目标表已经存在数据库中.需要从源表把数据插入到目标表的情况.如果目标表和源表的列相同,就不必列出数据列了.(未完待续,另参考资料中重复项太多,暂且...

671

扫码关注云+社区