MySQL 中 int (10) 和 int (11) 到底有什麼區別?

Herbie發表於2019-11-14

最近在找工作所以一直在面試,在面試過程中暴露了自己很多不足的地方,一直在總結和歸納。可能大部分面試官對mysql的問題都會問資料庫優化啊、主從複製啊、索引啊、引擎啊等等之類的。那麼使我印象最深的是int(10)和int(11)有什麼區別。這好像是最基礎的問題了,我好像從來沒有在意過。當時有點兒懵逼,有什麼區別?不知道!沒想過!
那麼回到家以後,我趕緊複習了下mysql的資料型別相關知識。對整數型別做些說明。

資料型別 說明 儲存需求
tinyint 很小的整數 1位元組
smallint 小的整數 2位元組
mediumint 中等大小的整數 3位元組
int(integer) 普通大小的整數 4位元組
bigint 大整數 8位元組
資料型別 有符號 無符號
tinyint -128~127 0~255
smallint -32768~32767 0~65535
mediumint -8388608~8388607 0~16777215
int(integer) -2147483648~2147483647 0~4294967295
bigint -9223372036854775808~9223372036854775807 0~18446744073709551615
資料型別 預設顯示寬度
tinyint 4
smallint 6
mediumint 9
int(integer) 11
bigint 20

*因為負號佔了一個數字位,所以各型別的寬度是最大值數字位+1位。例如tinyint的最大數字位是3,加負號所以顯示寬度是4。

那麼取值範圍和顯示寬度到底有什麼關係呢?我利用tinyint做了個實驗,首先建立一張表如下

mysql> desc test_integer;
+-----------+------------+------+-----+---------+----------------+
| Field     | Type       | Null | Key | Default | Extra          |
+-----------+------------+------+-----+---------+----------------+
| id        | int(11)    | NO   | PRI | NULL    | auto_increment |
| test_id_1 | tinyint(1) | NO   |     | NULL    |                |
| test_id_2 | tinyint(4) | NO   |     | NULL    |                |
+-----------+------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

我分別建立了有符號tinyint型別的test_id_1顯示寬度為1和test_id_2顯示寬度為4兩欄位,接下來插入資料,同時插入-128、1和127這些數值,看看會怎麼樣。

mysql> insert into test_integer (test_id_1,test_id_2) values (-128,-128), (1,1), (127,127);
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

ok提示插入成功,我們查詢一下

mysql> select * from test_integer;
+----+-----------+-----------+
| id | test_id_1 | test_id_2 |
+----+-----------+-----------+
|  1 |      -128 |      -128 |
|  2 |         1 |         1 |
|  3 |       127 |       127 |
+----+-----------+-----------+
3 rows in set (0.00 sec)

查詢出來的結果也是一樣,經過以上實驗得到結論:
顯示寬度整數型別的取值範圍是無關的。顯示寬度只是指明mysql最大可能顯示的數字個數,數值的位數小於指定的寬度時就由空格填充,如果插入了大於顯示寬度的值,只要該值不超過該型別整數的取值範圍,數值依然可以插入,而且能夠顯示出來。

同理,所以int(10)和int(11)沒有任何區別,就是顯示寬度不同,小夥伴們千萬不要忘記了呀。

相關文章