默认创建int类型的字段,SHOW CREATE TABLE table_name或DESC table_name常常可以看到其默认情况为int(11)。
这个int(M)很多时候都会被误解为最大范围,但是并不是这样的,int的范围是早已已经被指定好了的,并且无符号int的最大上限值为2^32-1。
做个实验:
mysql> CREATE TABLE a(id int(2)); Query OK, 0 rows affected (0.39 sec) mysql> INSERT INTO a SELECT 3333; Query OK, 1 row affected (0.03 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql> DESC a; +-------+--------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+--------+------+-----+---------+-------+ | id | int(2) | YES | | NULL | | +-------+--------+------+-----+---------+-------+ 1 row in set (0.00 sec) mysql> SELECT * FROM a; +------+ | id | +------+ | 3333 | +------+ 1 row in set (0.00 sec)
可以很轻易的看出这样写是没有任何问题的。
那么int(M)是干什么用的呢?
其实在创建int类型的字段时,可以添加一个ZEROFILL的值。
当然该约束可以用于不仅仅是int的整型数据,还可以用于其他的四种类型的整型数据。(此处拿int做例子)
ZEROFILL的作用是,根据整型数据类型提供的宽度,自动补零。
比如:
mysql> CREATE TABLE b(id int ZEROFILL); Query OK, 0 rows affected (0.28 sec) mysql> DESC b; +-------+---------------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------------------------+------+-----+---------+-------+ | id | int(10) unsigned zerofill | YES | | NULL | | +-------+---------------------------+------+-----+---------+-------+ 1 row in set (0.00 sec) mysql> INSERT INTO b SELECT 22; Query OK, 1 row affected (0.04 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql> INSERT INTO b SELECT 123456789; Query OK, 1 row affected (0.04 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql> SELECT * FROM b; +------------+ | id | +------------+ | 0000000022 | | 0123456789 | +------------+ 2 rows in set (0.00 sec)
此时可以很轻易的看出,在int(10)的情况下,在插入不足10位宽度的数字时,都会在数字前补0至10位宽度。
还可以看到,在添加了ZEROFILL之后,int的默认宽度由默认的11改为了10。
网上有部分结论与我所理解的有一部分不一样,不知与版本是否有关,此处版本:
mysql> SELECT version(); +-----------+ | version() | +-----------+ | 5.6.26 | +-----------+ 1 row in set (0.00 sec)