【mysql】关于mysql中int(M)类型的具体含义以及tinyint/smallint/mediumint/int/bigint的区别是什么?

之前定义数据库类型一直不理解int(M)的具体含义,M决定的是什么?不同M的值的区别是什么?tinyint / smallint / mediumint / int / bigint这些类型又有什么不同?
一开始,我会以为M觉得是数据范围的大小,比如int(5)比int(3)所表示的数值范围大,但是这是完全错误的一个想法。
实际情况是M是控制数值显示的宽度,而数值范围大小跟int这个类型本身表示的范围有关。
下面通过一个具体的例子看一下:
1、验证M的具体含义,这里重点在于zerofill关键字,所以在定义字段的时候分两种情况,字段指定zerofill和不指定zerofill去测试。

– 创建表
– 字段类型为int(10) 、M为10、指定 zerofill

drop table if exists t;
create table t(id int(10) zerofill)

– 插入一条位数为2位小于10位的数字10

insert into t(id) values(10)
select * from t

– 查询结果显示 0000000010,前方自动补了8个0、10位显示
在这里插入图片描述
– 修改表结构,设置为int(3)

ALTER TABLE t CHANGE COLUMN id id INT(3) ZEROFILL
select * from t

– 这时查询结果显示 010,这时前方自动补了1个0、3位显示
在这里插入图片描述
– 再插入一条位数为10大于3位的数字100000

insert into t(id) values(100000)
select * from t

– 查询结果显示 100000、刚才插入的10还是显示3位的010。这里未免有个疑惑,为什么不显示3位,而是原样显示,我们先打个?号。
在这里插入图片描述

下面接着修改表结构,列不指定zerofill的情况

ALTER TABLE t CHANGE COLUMN id id INT(3)
select * from t

– 再次查询结果:以上插入的两条数据分别显示10 、100000 ,都是原样显示。
在这里插入图片描述
到这里已经很清晰了,关于int(M)可以做个总结。

– 总结:int(M),M 只是控制数值显示的宽度,并且是在zerofill指定的情况下才会区别出不同。
– 如果zerofill不指定,数值显示的宽度和插入的数据保持一致。
– 如果zerofill指定,插入的数据小于指定的宽度时,前方补零,大于显示的宽度时,保持原样。

2、下面开始探索第二个问题,关于int类型可插入的数值范围是由什么决定的?
– 前面说过对于int插入的数值的大小范围跟M是没有关系的,跟int这个类型有关系,这里重点在于unsigned关键字,所以在定义字段的时候分两种情况,字段指定unsigned和不指定unsigned去测试。

– 关于int表示的数值范围:
– 有符号 -2147483648 ~ 2147483647
– 无符号 0 ~ 4294967295

– 创建表,字段默认是有符号

drop table if exists t;
create table t(id int)

– 依次插入下面四个数值

insert into t(id) values(-2147483648)
insert into t(id) values(-2147483649)
insert into t(id) values(2147483647)
insert into t(id) values(2147483648)
select * from t

– 插入-2147483648,查询结果显示:-2147483648
– 插入-2147483649时报错:Out of range value for column ‘id’ at row 1 超出了可表示的值得范围
在这里插入图片描述
– 插入2147483647,查询结果显示:2147483647
– 插入2147483648时报错:Out of range value for column ‘id’ at row 1
在这里插入图片描述
– 将字段设计成无符号再进行测试

drop table if exists t;
create table t(id int UNSIGNED)

– 依次插入下面四个数值

insert into t(id) values(-1)
insert into t(id) values(0)
insert into t(id) values(4294967295)
insert into t(id) values(4294967296)
select * from t

– 插入-1时报错:Out of range value for column ‘id’ at row 1
在这里插入图片描述
– 插入0,查询结果显示:0
– 插入4294967295,查询结果显示:4294967295
– 插入4294967296时报错:Out of range value for column ‘id’ at row 1
在这里插入图片描述
由此可以得出结论:插入数据的范围首先跟int类型本身可表示的数值范围有关,数值范围又分为
有符号数和无符号数。
注意:当字段指定zerofill时,字段可存储的范围也会按照无符号来进行。

3.第三个问题就是tinyint / smallint / mediumint / int / bigint这些类型有什么区别。下面看个表格。
在这里插入图片描述
这几种类型最大的不同在与存储的时候所占用的字节数不同,当然相应的可表示的数值的最大范围也不同。用户在定义字段类型时,可以根据自己的需求去选择。

作者:吴玉婷
更新日期:2021/6/7
如有问题请指出,感谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值