聊聊Mysql中的int(1)
昨天有個(gè)讀者問(wèn)了我這樣一個(gè)問(wèn)題在mysql中建表的時(shí)候,我設(shè)置一個(gè)字段為int類型,長(zhǎng)度為1,但是我發(fā)現(xiàn)這個(gè)字段卻可以存儲(chǔ)任意長(zhǎng)度的數(shù)字,這是什么情況?這個(gè)問(wèn)題在我剛接觸數(shù)據(jù)庫(kù)的時(shí)候也遇到過(guò),我覺(jué)得有必要寫一篇文章來(lái)解釋一下。
0?和?1?是計(jì)算機(jī)最基本的存儲(chǔ)單位。也是?CPU?采用的最基本的計(jì)算單位,也就是二進(jìn)制。int?類型占?4?個(gè)字節(jié),一個(gè)字節(jié)是?8?位,也就是說(shuō)?int?類型在計(jì)算機(jī)底層是由?32?個(gè)?0?跟?1?表示,轉(zhuǎn)化為十進(jìn)制就是?2?的?32?次方,那么存儲(chǔ)范圍就是?0~2^32?,如果帶符號(hào)位的話就是?-2^31?~?2^31-1?。
在使用SQLyog工具建表時(shí),除了常見(jiàn)的幾個(gè)屬性Field Name,DataType,Len,Default,PK?,Not Null?,Auto Incr?,Comment之外,還有兩個(gè)不常用的Unsigned?和Zerofill?,這兩個(gè)屬性到底有什么用呢?
Unsigned:無(wú)符號(hào)的,意思就是只能為正數(shù),不能為負(fù)數(shù)。
Zerofill:零填充,意思就是達(dá)不到指定長(zhǎng)度后,前面用?0?來(lái)填充。
現(xiàn)在再來(lái)看看這個(gè)int(1)中的1究竟有什么奧秘。這個(gè)1跟這個(gè)字段能存的數(shù)據(jù)范圍沒(méi)關(guān)系,它也不是限制這個(gè)字段的數(shù)據(jù)長(zhǎng)度的。這個(gè)字段存儲(chǔ)的數(shù)據(jù)范圍是由int來(lái)限制的。
這個(gè)1只是規(guī)定了數(shù)據(jù)的寬度,如果你選擇了Zerofill屬性,就能更好地理解這個(gè)1了,如果我們寫入的數(shù)據(jù)達(dá)不到這個(gè)長(zhǎng)度,那么就會(huì)在數(shù)據(jù)前面補(bǔ)0來(lái)達(dá)到這個(gè)長(zhǎng)度。比如我們將int(1)改成int(3),我們?cè)佥斎?code style="margin-right: 2px;margin-left: 2px;padding: 2px 4px;font-size: inherit;line-height: inherit;overflow-wrap: break-word;border-radius: 4px;color: rgb(248, 35, 117);background: rgb(248, 248, 248);">1,實(shí)際上顯示的是001。所以無(wú)論你將?int?類型的長(zhǎng)度設(shè)為多少并不會(huì)影響數(shù)據(jù)的存儲(chǔ)范圍。
mysql對(duì)于整型的數(shù)據(jù)類型,不僅給我們提供了int,還提供了tinyint,smallint,mediumint和bigint。這些類型存儲(chǔ)的數(shù)據(jù)范圍都是不一樣的,具體如下表:
| 類型 | 字節(jié) | 最小值 | 最大值 |
|---|---|---|---|
| (帶符號(hào)的/無(wú)符號(hào)的) | (帶符號(hào)的/無(wú)符號(hào)的) | ||
| TINYINT | 1 | -128 | 127 |
| 0 | 255 | ||
| SMALLINT | 2 | -32768 | 32767 |
| 0 | 65535 | ||
| MEDIUMINT | 3 | -8388608 | 8388607 |
| 0 | 16777215 | ||
| INT | 4 | -2147483648 | 2147483647 |
| 0 | 4294967295 | ||
| BIGINT | 8 | -9223372036854775808 | 9223372036854775807 |
| 0 | 18446744073709551615 |
看到這兒,應(yīng)該已經(jīng)清楚int(1)的真正含義了。根據(jù)實(shí)際需求選擇合適的數(shù)據(jù)類型來(lái)存儲(chǔ)就可以了。
再來(lái)聊一聊一個(gè)常見(jiàn)的面試題:int類型做自增主鍵有沒(méi)有可能存儲(chǔ)完?
肯定是有的,都有數(shù)據(jù)范圍了,主鍵一直增長(zhǎng)肯定有可能會(huì)達(dá)到這個(gè)范圍。
很多小伙伴是不是心中飄過(guò)一萬(wàn)匹草泥馬,忙著修改數(shù)據(jù)庫(kù)去了。這其實(shí)大可不必?fù)?dān)心,這個(gè)數(shù)字大概是42億。如果數(shù)據(jù)量夠夠夠夠大,你選擇bigint做為自增主鍵肯定沒(méi)啥問(wèn)題。這個(gè)數(shù)字我已經(jīng)讀不出來(lái)了,交給評(píng)論區(qū)的你們來(lái)讀!
