mysql设置数字类型时候bigint、int、tinyint、smallint的区别以及tinyint(m)这个m具体的含义

 

问题引入:

这是一个很有意思的问题,因为我发现,很多同学在创建DB表结构的时候,tinyint(3)、int(10)的方式用着,但是当问到括号里的数字有什么用,或者其能支持的最大数据范围的时候,都有点懵,在这里做下科普,增加下大家的认识。


 

直接说结论:

字段能够表示的数据范围,在选择数据类型的时候就确定了,跟括号里的数字没有任何关系,括号里的数字只是用来决定展示的时候,是否进行长度补足的。


 

上面数字类型的数字类型,支持的数据范围:

 

上面说了,不同数据类型占用的字节数:

tinyint 占1个字节,一个Byte 等于 8个bit, 也就是最大表示的二进制位 11111111,换算过来为 255,如果选择区分正负的话,范围就是[-128,127], 不区分的是[0,255],是否正负,就从建表的时候,看是否设置了unsigned。

同理 smallint 占2个字节,mediumint 占3个字节,int 占4个字节,bigint 占8个字节。

 


 

那么问题来了?

为什么我建了张表,是tinyint(2), 但是当我插入1的时候,select 出来的也依然是1呢?

那是因为我没有指定补位选择的字符,于是我修改表结构为下图:

这个时候,我得到的结果就是补了0后的 01

 


 

 顺便说点相关的,当我们设置的数据最大范围不满足我们要插入的数据时,就只能插入到当前的区间边界了,比如:

支持范围 [0,255], 插入 -20的时候,入库的结果为0

支持范围 [-128,127],插入 200的时候,入库的结果为127

 

综上所述:

我们常见的设置了tinyint(3) 但是又没有补位设置的sql, 实际上是根本没有效果、也是没有必要整这个括号的(不写的话,系统也会默认创建个(4)进去,也没实际效果)。

posted on 2019-05-13 14:26  古木小永  阅读(713)  评论(0)    收藏  举报

导航