MySQL支持多种数据类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。其中, 整数类型包括:TINYINT、SMALLINT、MEDIUMINT、INT和BIGINT。

下表显示了整数类型的存储和范围。

int mysql 整形范围 mysql的整数类型_int mysql 整形范围


本文将以tinyint为例,详细解释它的大小和范围。 tinyint的大小为1字节,即8位二进制。

在无符号的情况下,值得范围(0,255)比较容易理解,

int mysql 整形范围 mysql的整数类型_内存空间_02


在有符号的情况下,用最高位表示符号位,其中 0表示正数,1表示负数。先来看正数范围(0,127):

int mysql 整形范围 mysql的整数类型_int mysql 整形范围_03


接下来看负数的情况,下面的理解很直观,但必须注意:这种理解是错的!稍后会解释原因。

1 0000000 --------------> -0

1 1111111 -------------> -127

也许你会说,首位是1,表示负数。后面7位表示数值,将数值乘以符号就得到了负数,多么完美又直观的表示!

可是,你应该也已经发现了,在这种表示方式下,能够表示的最小负数为-127,0就被分为 +0和-0两种编码方法,这完全是浪费的。为了避免这种浪费,计算机科学家们设计出了另外一套负数的编码方式,即补码。

 在补码表示方式下,0只有一种表示,而且能够表示的最小负数为-128。

int mysql 整形范围 mysql的整数类型_int mysql 整形范围_04


所以,在有符号的情况下,tinyint的表示范围为(-128,127)。

同理,可以分析其他整数类型在有符号和无符号情况下,能够表示的数值范围。

MySQL中BIGINT与Java数据类型对应问题

如果不是无符号类型,BIGINT(20)的取值范围为-9223372036854775808~9223372036854775807。与Java.lang.Long的取值范围完全一致,mybatis会将其映射为Long
而BIGINT(20) UNSIGNED的取值范围是0 ~ 18446744073709551615,其中一半的数据超出了Long的取值范围,Mybatis将其映射为BigInteger
有符号int最大可以支持到约22亿,远远大于我们的需求和MySQL单表所能支持的性能上限。对于OLTP应用来说,单表的规模一般要保持在千万级别,不会达到22亿上限。
无符号int,上限为42亿,这个预留量已经是非常的充足了。使用bigint,会占用更大的磁盘和内存空间,内存空间毕竟有限,无效的占用会导致更多的数据换入换出,额外增加了IO的压力,对性能是不利的。