整數(shù)類型 | 字節(jié) | 有符號范圍 | 無符號范圍 |
TINYINT | 1 | -128 ~ 127 | 0 ~ 255 |
SMALLINT | 2 | -32768 ~ 32767 | 0 ~ 65535 |
MEDIUMINT | 3 | -8388608 ~ 8388607 | 0 ~ 16777215 |
INT/INTEGER | 4 | -2147483648 ~ 2147483647 | 0 ~ 4294967295 |
BIGINT | 8 | -9223372036854775808 ~ 9223372036854775807 | 0 ~ 18446744073709551615 |
表格一共有四列分別表示:字段類型, 占用字節(jié)數(shù), 有符號范圍, 無符號范圍。
我們拿int類型為例:
int類型, 占用字節(jié)數(shù)為4byte, 學(xué)過計(jì)算機(jī)原理的同學(xué)應(yīng)該知道, 字節(jié)(byte)并非是計(jì)算機(jī)存儲的最小單位, 還有比字節(jié)(byte)更小的單位, 也就是位(bit),一個位就代表一個0或1; 8個位組成一個字節(jié); 一般字節(jié)用大寫B(tài)來表示byte, 位用小寫b來表示bit.
計(jì)算機(jī)存儲單位的換算: 1B=8b 1KB=1024B 1MB=1024KB
那么根據(jù)int類型允許存儲的字節(jié)數(shù)是4個字節(jié), 我們就能換算出int UNSIGNED(無符號)類型的能存儲的最小值為0, 最大值為4294967295(即4B=32b, 最大值即為32個1組成,即4294967295換算成二進(jìn)制則是32個1)。
2.存儲范圍測試
mysql> CREATE TABLE test_int ( -> col1 TINYINT, -> col2 SMALLINT, -> col3 MEDIUMINT, -> col4 INT, -> col5 BIGINT -> ) ENGINE = INNODB DEFAULT CHARSET = utf8;Query OK, 0 rows affected (0.01 sec) mysql> show create table test_int\G*************************** 1. row *************************** Table: test_intCreate Table: CREATE TABLE `test_int` ( `col1` tinyint(4) DEFAULT NULL, `col2` smallint(6) DEFAULT NULL, `col3` mediumint(9) DEFAULT NULL, `col4` int(11) DEFAULT NULL, `col5` bigint(20) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf81 row in set (0.00 sec) mysql> insert into test_int values (1234,123456,12345678,12345678901,12345678901234567890);Query OK, 1 row affected, 5 warnings (0.00 sec) mysql> insert into test_int values (-1234,-123456,-12345678,-12345678901,-12345678901234567890);Query OK, 1 row affected, 5 warnings (0.01 sec) mysql> show warnings;+---------+------+-----------------------------------------------+| Level | Code | Message |+---------+------+-----------------------------------------------+| Warning | 1264 | Out of range value for column 'col1' at row 1 || Warning | 1264 | Out of range value for column 'col2' at row 1 || Warning | 1264 | Out of range value for column 'col3' at row 1 || Warning | 1264 | Out of range value for column 'col4' at row 1 || Warning | 1264 | Out of range value for column 'col5' at row 1 |+---------+------+-----------------------------------------------+5 rows in set (0.01 sec) mysql> select * from test_int;+------+--------+----------+-------------+----------------------+| col1 | col2 | col3 | col4 | col5 |+------+--------+----------+-------------+----------------------+| 127 | 32767 | 8388607 | 2147483647 | 9223372036854775807 || -128 | -32768 | -8388608 | -2147483648 | -9223372036854775808 |+------+--------+----------+-------------+----------------------+
從上述測試中我們可以看出:有符號時,各種整型類型最大的存儲范圍,當(dāng)存儲數(shù)字大小不在存儲范圍時,MySQL會產(chǎn)生告警,但數(shù)字可以插入,默認(rèn)截取為可存儲的最大值或最小值。
3.int(M)中M的含義與zerofill的使用
我們經(jīng)常聽到這句話:int(M)中的M代表最大顯示寬度,"最大顯示寬度"我們第一反應(yīng)是該字段的值最大能允許存放的值的寬度,以為我們建了int(1),就不能存放數(shù)據(jù)10了, 其實(shí)不是這個意思。
整數(shù)列的顯示寬度與mysql需要用多少個字符來顯示該列數(shù)值,與該整數(shù)需要的存儲空間的大小都沒有關(guān)系,比如,不管設(shè)定了顯示寬度是多少個字符,int都是占用4個字節(jié),bigint都要占用8個字節(jié)。即int(5)和int(10)可存儲的范圍一樣。
整型字段有個ZEROFILL屬性(0填充),在數(shù)字長度不夠的數(shù)據(jù)前面填充0,以達(dá)到設(shè)定的長度。加上ZEROFILL后M才表現(xiàn)出不同,當(dāng)使用ZEROFILL時,默認(rèn)會自動加unsigned(無符號)屬性。比如 INT(3) ZEROFILL,你插入到數(shù)據(jù)庫里的是10,則實(shí)際插入為010,也就是在前面補(bǔ)充加了一個0,下面我們來測試下:
mysql> CREATE TABLE test_int_zerofill ( -> col1 INT(5) ZEROFILL, -> col2 INT ZEROFILL, -> col3 INT(5) -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;Query OK, 0 rows affected (0.01 sec) mysql> show create table test_int_zerofill\G*************************** 1. row *************************** Table: test_int_zerofillCreate Table: CREATE TABLE `test_int_zerofill` ( `col1` int(5) unsigned zerofill DEFAULT NULL, `col2` int(10) unsigned zerofill DEFAULT NULL, `col3` int(5) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf81 row in set (0.00 sec) mysql> insert into test_int_zerofill values (12,12,12);Query OK, 1 row affected (0.00 sec) mysql> select * from test_int_zerofill;+-------+------------+------+| col1 | col2 | col3 |+-------+------------+------+| 00012 | 0000000012 | 12 |+-------+------------+------+1 row in set (0.00 sec)
那么有同學(xué)可能會問zerofill有什么應(yīng)用場景呢,比較常用的應(yīng)該是月份或日期前補(bǔ)0,這樣顯示的會規(guī)范些
CREATE TABLE `t_zerofill` ( `year` year(4) DEFAULT NULL, `month` int(2) unsigned zerofill DEFAULT NULL, `day` int(2) unsigned zerofill DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; mysql> insert into t_zerofill values (2019,6,5);Query OK, 1 row affected (0.01 sec) mysql> insert into t_zerofill values (2019,6,18);Query OK, 1 row affected (0.00 sec) mysql> insert into t_zerofill values (2019,10,1);Query OK, 1 row affected (0.00 sec) mysql> insert into t_zerofill values (2019,11,11);Query OK, 1 row affected (0.01 sec) mysql> select * from t_zerofill;+------+-------+------+| year | month | day |+------+-------+------+| 2019 | 06 | 05 || 2019 | 06 | 18 || 2019 | 10 | 01 || 2019 | 11 | 11 |+------+-------+------+4 rows in set (0.00 sec)
4.類型選取
經(jīng)過上面的介紹,關(guān)于不同整型字段的選取變得容易很多。本著最小化存儲的原則,當(dāng)然是能選TINYINT不選SMALLINT,能選MEDIUMINT不選INT了,不過一切都要滿足業(yè)務(wù)的前提下盡量選取占用字節(jié)更少的類型。對于確定只存儲正整數(shù)的字段,可以加上unsigned屬性,這樣會使存儲范圍更大,比如當(dāng)字段有AUTO_INCREMENT屬性時,我們可以為int類型加上unsigned屬性。
以上就是MySQL INT類型全解析的詳細(xì)內(nèi)容,更多關(guān)于MySQL INT類型的資料請關(guān)注腳本之家其它相關(guān)文章!
標(biāo)簽:鷹潭 合肥 貴州 臺灣 阜新 北京 鎮(zhèn)江 日照
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《MySQL INT類型全解析》,本文關(guān)鍵詞 MySQL,INT,類型,全,解析,MySQL,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。上一篇:詳解MySQL 外鍵約束