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)。
同理,可以分析其他整数类型在有符号和无符号情况下,能够表示的数值范围。