MySQL中整数类型后面的数字的含义

MySQL Integer Types

Posted by alovn on July 20, 2019

先看下MySQL官方文档中对几种int类型的说明 integer-types

11.2.1 Integer Types (Exact Value) - INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT MySQL supports the SQL standard integer types INTEGER (or INT) and SMALLINT. As an extension to the standard, MySQL also supports the integer types TINYINT, MEDIUMINT, and BIGINT. The following table shows the required storage and range for each integer type.

Required Storage and Range for Integer Types Supported by MySQL

TypeStorage (Bytes)Minimum Value SignedMinimum Value UnsignedMaximum Value SignedMaximum Value Unsigned
TINYINT1-1280127255
SMALLINT2-3276803276765535
MEDIUMINT3-83886080838860716777215
INT4-2147483648021474836474294967295
BIGINT8$-2^{63}$0$2^{63}-1$$2^{64}-1$

MySQL已经定义了每种类型占用字节长度和数值范围,上面表格一目了然。那么MySQL中整型类型后面的数字又是什么意思呢?比如说: int(10)、int(11)、bingint(20).

其实这些类型长度都是固定的,其容量不会随着后面的数字而变化的。int(10)、int(11)都是占用4个字节,tinyint(1)与tinyint(10)也都是占用1个字节。既然长度是固定的,那么后面的10、11这些数字又有什么用呢?

其实在MySQL数据库中:数据类型(m)用于约束数据,数字m在不同数据类型中表示的含义也不相同,我们这里先只看整型。

整型类型已经限制了取值范围,tinyint占1个字节、int占4个字节。所以整型数后面的m不是表示的数据长度,而是表示数据在显示时显示的最小长度。 tinyint(1) 这里的1表示的是 最短显示一个字符。tinyint(2) 这里的2表示的是 最短显示两个字符。 当字符长度超过(m)时,相当于啥都没发生; 当字符长度小于(m)时,就需要指定拿某个字符来填充,比如zerofill(表示用0填充), 设置tinyint(2) zerofill 你插入1时他会显示01;设置tinyint(4) zerofill 你插入1时他会显示0001。 所以,没有zerofill,(m)就是无用的。

bigint(10)和bigint(20)的区别在于如果表定义加上zerofill后在客户端显示长度不同,如果在创建bigint类型的字段时不指定长度则默认长度为20.