MySQL支持多种数据类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。其中, 整数类型包括:TINYINT、SMALLINT、MEDIUMINT、INT和BIGINT。
下表显示了整数类型的存储和范围。
类型
大小
范围(有符号)
范围(无符号)
用途
TINYINT
1 字节
(-128,127)
(0,255)
小整数值
SMALLINT
2 字节
(-32 768,32 767)
(0,65 535)
大整数值
MEDIUMINT
3字节
(-8 388 608,8 388 607)
(0,16 777 215)
大整数值
INT
4 字节
(-2 147 483 648,2 147 483 647)
(0,4 294 967 295)
大整数值
BIGINT
8 字节
(-9 233 372 036 854 775 808,
9 223 372 036 854 775 807)
(0,18 446 744 073 709 551 615)
超大整数值
本文将以tinyint为例,详细解释它的大小和范围。 tinyint的大小为1字节,即8位二进制。
在无符号的情况下,值得范围(0,255)比较容易理解,
二进制
十进制
0000 0000
0
1111 1111
255
在有符号的情况下,用最高位表示符号位,其中 0表示正数,1表示负数。先来看正数范围(0,127):
二进制
十进制
0 0000000
0
0 1111111
127
接下来看负数的情况,下面的理解很直观,但必须注意:这种理解是错的!稍后会解释原因。
1 0000000 --------------> -0
1 1111111 -------------> -127
也许你会说,首位是1,表示负数。后面7位表示数值,将数值乘以符号就得到了负数,多么完美又直观的表示!
可是,你应该也已经发现了,在这种表示方式下,能够表示的最小负数为-127,0就被分为 +0和-0两种编码方法,这完全是浪费的。为了避免这种浪费,计算机科学家们设计出了另外一套负数的编码方式,即补码。
在补码表示方式下,0只有一种表示,而且能够表示的最小负数为-128。
二进制
十进制
1 0000000
-128
1 1111111
-1
所以,在有符号的情况下,tinyint的表示范围为(-128,127)。
同理,可以分析其他整数类型在有符号和无符号情况下,能够表示的数值范围。