MySQL int(11)及int(M)解析

神諭丶發表於2015-09-21
預設建立int型別的欄位,SHOW CREATE TABLE table_name或DESC table_name常常可以看到其預設情況為int(11)。

這個int(M)很多時候都會被誤解為最大範圍,但是並不是這樣的,int的範圍是早已已經被指定好了的,並且無符號int的最大上限值為2^32-1。

做個實驗:

  1. mysql> CREATE TABLE a(id int(2));
  2. Query OK, 0 rows affected (0.39 sec)

  3. mysql> INSERT INTO a SELECT 3333;
  4. Query OK, 1 row affected (0.03 sec)
  5. Records: 1 Duplicates: 0 Warnings: 0

  6. mysql> DESC a;
  7. +-------+--------+------+-----+---------+-------+
  8. | Field  | Type   | Null | Key | Default  | Extra |
  9. +-------+--------+------+-----+---------+-------+
  10. | id    | int(2)  | YES  |      | NULL     |       |
  11. +-------+--------+------+-----+---------+-------+
  12. 1 row in set (0.00 sec)

  13. mysql> SELECT * FROM a;
  14. +------+
  15. | id   |
  16. +------+
  17. | 3333 |
  18. +------+
  19. 1 row in set (0.00 sec)

可以很輕易的看出這樣寫是沒有任何問題的。



那麼int(M)是幹什麼用的呢?

其實在建立int型別的欄位時,可以新增一個ZEROFILL的值
當然該約束可以用於不僅僅是int的整型資料,還可以用於其他的四種型別的整型資料。(此處拿int做例子)

ZEROFILL的作用是,根據整型資料型別提供的寬度,自動補零。
比如:
  1. mysql> CREATE TABLE b(id int ZEROFILL);
  2. Query OK, 0 rows affected (0.28 sec)

  3. mysql> DESC b;
  4. +-------+---------------------------+------+-----+---------+-------+
  5. | Field  | Type                      | Null | Key | Default  | Extra |
  6. +-------+---------------------------+------+-----+---------+-------+
  7. | id    | int(10) unsigned zerofill  | YES |      | NULL    |        |
  8. +-------+---------------------------+------+-----+---------+-------+
  9. 1 row in set (0.00 sec)

  10. mysql> INSERT INTO b SELECT 22;
  11. Query OK, 1 row affected (0.04 sec)
  12. Records: 1 Duplicates: 0 Warnings: 0

  13. mysql> INSERT INTO b SELECT 123456789;
  14. Query OK, 1 row affected (0.04 sec)
  15. Records: 1 Duplicates: 0 Warnings: 0

  16. mysql> SELECT * FROM b;
  17. +------------+
  18. | id         |
  19. +------------+
  20. | 0000000022 |
  21. | 0123456789 |
  22. +------------+
  23. 2 rows in set (0.00 sec)
此時可以很輕易的看出,在int(10)的情況下,在插入不足10位寬度的數字時,都會在數字前補0至10位寬度。
還可以看到,在新增了ZEROFILL之後,int的預設寬度由預設的11改為了10。

網上有部分結論與我所理解的有一部分不一樣,不知與版本是否有關,此處版本:

  1. mysql> SELECT version();
  2. +-----------+
  3. | version()  |
  4. +-----------+
  5. | 5.6.26    |
  6. +-----------+
  7. 1 row in set (0.00 sec)


關於整型資料型別範圍值可參考
http://blog.itpub.net/29773961/viewspace-1803302/

作者公眾號(持續更新)

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29773961/viewspace-1804920/,如需轉載,請註明出處,否則將追究法律責任。

相關文章