最近在找工作所以一直在面試,在面試過程中暴露了自己很多不足的地方,一直在總結和歸納。可能大部分面試官對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)沒有任何區別,就是顯示寬度不同,小夥伴們千萬不要忘記了呀。