mysql中tinyint、smallint、mediumint、int、bigint字段类型储存范围储存长度详解
作者:mmseoamin日期:2023-12-14

mysql建模过程中,最优的字段设置可以提高查询速度和节约磁盘空间,这对于优化数据库来说是非常重要的

首先需要先理解三个基本概念:

1字节(byte)=8位(bit)一位可以存储0或者1;

二进制整数和十进制整数的转换?

十进制整数转换为二进制整数采用"除2取余,逆序排列";

二进制整数转十进制整数:无符号整数,从右往左依次用二进制位上的数字乘以2的n次幂的和(n大于等于0);

带符号的二进制整数,除去最高位的符号位(1为负数,0为正数);

1的二进制
2| 1 |  ......余1
1的二进制:00000001
00000001的十进制:2的0次方
23的二进制
2| 23 |     余1
2| 11 |     余1 
2|  5 |     余1
2|  2 |     余0
 |  1 |     余1
 23的二进制:00010111
10111000的十进制:2^0+2^2+2^3+2^4
什么是无符号整形?什么是有符号整形?

就是有无正负标识的整型,计算机编译都是二进制表示的,有符号的整型用最高位来作为符号代表,

“0"代表”+“,“1"代表”-”; 。 (带符号的二进制补码表示法中,第一位就是表示符号,二进制本身无关,即使184的二进制是10111000,但在带符号表示法中第一位1表示的是"-"

最终的表示:取反:01000111加1:01000111 + 1 = 01001000所以,10111000 表示的带符号整数是 -72)

8位无符号整型取值范围:
(0000 0000-1111 1111):0 ~ 255
8位有符号整型取值范围:
00000000到01111111,表示0到+127  10000001到11111111,表示-1到-127
10000000没有用到,因为如果我们把它看成-0,那么会和00000000发生重复;
于是计算机将10000000定义为-128(即在最终进位后符号位不产生进位)
n位无符号整数,取值范围:
0 ~ ( 2^n - 1 )
n位有符号整数,取值范围:
-(2^(n-1)) ~ +(2^(n-1) - 1)

mysql中的整型常见细分为tinyint、smallint、mediumint、int、bigint

tinyint:

储存占一个字节,一个字节8个位,1bit可以储存1或者0两种可能性,因此tinyint可以储存2的8次方,
也就是256种可能性,从0开始计算,无符号可以储存0~255,有符号则是-128 ~127

smallint:

  储存占2个字节,同上也就是2的16次方可以储存65536种可能性,从0开始计算无符号存储0 ~65535,
  有符号则是-32768 ~32767

mediumint:

 存储所占三个字节,也就是2的24次方,可以存储16777216种可能性,无符号可以存储0~ 16777215,
 有符号可以存储-8388608~8388607

int:

 存储所占四个字节,也就是2的32次方,可以存储4294967296种可能性,无符号可以存储0~ 4294967295,
 有符号则是-2147483648~2147483647

bigint:

 存储所占8个字节,也就是2的64次方,可以存储18,446,744,073,709,551,616种可能性,
 无符号可以存储0 ~ ( 2^64 - 1 ),有符号则是-(2^(64-1)) ~ +(2^(64-1) - 1)

我们在建模时后面的长度tinyint(1),指的是数据的最大显示宽度,并不代表该类型储存的长度

在mysql中unsigned表示’无符号’的意思,即在下面例子中最大储存值为255

在mysql中zerofill表示数值宽度小于指定宽度后自动补0(当使用zerofill 时,默认会自动加unsigned(无符号)属性)

create table display_witdh(id tinyint(5) unsigned zerofill);
insert into display_witdh values(1),(255);
select * FROM display_witdh;
查询结果自动补0
|   id    |
|—————————|
|  00001  |
|—————————|
|  00225  |

如果定义字段时没有指定显示宽度,则以该类型能储存的最大值长度作为默认值,例如int默认情况下能储存2147483647,总共10个数组,符号位会占一个宽度,因此int默认是11。