MySQL中建表时的int(m)中的m代表什么意思?
在我们使⽤MySQL数据库管理⼯具建表时,经常在使⽤选择整数类型⽐如int后会选择“长度”这⼀属性值,如下图:
我们也可以使⽤下列sql语句在建表:
CREATE TABLE `test` (
`test1` int(3) unsigned zerofill DEFAULT NULL,
`test2` int(10) unsigned zerofill DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
那么上⾯的语句中的int(3)和int(10)中的“3”和“10”代表什么意思呢?是表⽰“test1”和“test2”这两列的数据
长度分别为3位和10位吗?其实不然,这⾥的“3”和“10”表⽰的是这该列数据的“最⼤显⽰长度”。这是什么意思呢?当我们在建表时加上zerofill的属性后就可以看出“3”和“10”的区别,下⾯我们分别在“test1”列和“test2”列都插⼊值444444444和4:
从上图可以看出,所谓的“最⼤显⽰长度”即是我们的数据的显⽰长度,当我们定义数据库中的某⼀列的整数类型为int(m)后并且为这⼀列加上zerofill(⽤“0”填充)属性后,如果数据的值的长度⼩于m,那么MySQL会⾃动为我们的数据值从右向左填充“0”直到数据的显⽰长度等于0为⽌,⽐如上⾯的“test1”列和“test2”列的值为“444444444”时,因为“test2”列的显⽰长度为10,
⽽“444444444”的长度为9,所以MySQL会⾃动帮我们在“444444444”的左边补⼀个0,⽽“test1”列的长度为3,则不会填充0;同理,当“test1”列的值为“4”时,MySQL会⾃动在“4”的左边填充“00”。
综上所述,int(m)中的m其实和插⼊该列的数据的值的长度(⼤⼩范围)没有关系,当我们定义某⼀列的数据类型为int时,不管是int(3)或者是int(10),这⼀列的数据的值⼤⼩范围是⼀样的,在没有负数的情况下,都为0 到 4294967295,因为int的数据类型为占4个字节的⼆进制数,⼀个字节为8位,所以
在没有区分正负值的情况下int的数据范围为0(32位数字都为0)到 4 294 967 295(32位数字都为1,即2的32次⽅)。如果在有符号的情况下:则int的范围为:-2147483648 到 2147483647。下⾯是MySQL的⼀些数据类型的⼤⼩和范围:
最后要注意⼀点的是,如果在整数列中保存超过显⽰宽度的⼀个值,当 MySQL 为复杂联接⽣成临时表时会遇到问题,因为在这些情况下MySQL 相信数据适合原列宽度。