MySQL類型關鍵字后面的括號內指定整數值的顯示寬度(例如,INT(11))。該可選顯示寬度規定用於顯示寬度小於指定的列寬度的值時從左側填滿寬度。顯示寬度並不限制可以在列內保存的值的范圍,也不限制超過列的指定寬度的值的顯示。
所以INT(1)和INT(11)默認是沒有任何區別的!!!
mysql> desc t1; +-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | id | int(1) | YES | | NULL | | | uid | int(11) | YES | | NULL | | +-------+---------+------+-----+---------+-------+ 2 rows in set (0.00 sec) mysql>
mysql> insert into t1 select 123,1234; Query OK, 1 row affected (0.04 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql> select * from t1; +------+------+ | id | uid | +------+------+ | 123 | 1234 | +------+------+ 1 row in set (0.05 sec) mysql>
當結合可選擴展屬性ZEROFILL使用時, 默認補充的空格用零代替。例如,對於聲明為INT(5) ZEROFILL的列,值4檢索為00004。請注意如果在整數列保存超過顯示寬度的一個值,當MySQL為復雜聯接生成臨時表時會遇到問題,因為在這些情況下MySQL相信數據適合原列寬度。
所有整數類型可以有一個可選(非標准)屬性UNSIGNED。當你想要在列內只允許非負數和該列需要較大的上限數值范圍時可以使用無符號值。如果設置了ZEROFILL擴展屬性試,默認就有了無符號屬性(UNSIGNED)
所以INT(1)與INT(11)后的括號中的字符表示顯示寬度,整數列的顯示寬度與MySQL需要用多少個字符來顯示該列數值,與該整數需要的存儲空間的大小都沒有關系,INT類型的字段能存儲的數據上限還是2147483647(有符號型)和4294967295(無符號型)。其實當我們在選擇使用INT的類型的時候,不論是INT(1)還是INT(11),它在數據庫里面存儲的都是4個字節的長度。
mysql> desc t2; +-------+---------------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------------------------+------+-----+---------+-------+ | id | int(1) unsigned zerofill | YES | | NULL | | | uid | int(11) unsigned zerofill | YES | | NULL | | +-------+---------------------------+------+-----+---------+-------+ 2 rows in set (0.00 sec) mysql>
mysql> insert into t2 select 123456,123456789; Query OK, 1 row affected (0.01 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql> insert into t2 select 123456,1234567899; Query OK, 1 row affected (0.01 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql> select * from t2; +--------+-------------+ | id | uid | +--------+-------------+ | 123456 | 00123456789 | | 123456 | 01234567899 | +--------+-------------+ 2 rows in set (0.00 sec) mysql>
總結:
INT(M) ZEROFILL,加上ZEROFILL后M才表現出不同,比如 INT(3) ZEROFILL,你插入到數據庫里的是10,則實際插入為010,也就是在前面補充加了一個0.如果INT(3)和INT(10)不加ZEROFILL,則它們沒有什么區別.M不是用來限制INT列內保存值的范圍的.int(M)的最大值和最小值與UNSIGNED有關。