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)进去,也没实际效果)。
浙公网安备 33010602011771号