MySQL資料庫int型別的那些事

逃亡兔發表於2017-12-24

某天朋友問我“為什麼我在MySQL資料庫中,建表的SQL語句和查詢建表後的建表語句不一樣啊,int型別的自動變為int(11)了”。我只能回答,“就是醬紫的啊,MySQL就這麼設計的”。可是我不能回答為什麼會是這樣,為什麼會是11不是12呢。突然發現自己好low啊,這個問題都回答不了。查了相關資料和做了如下測試後算是徹底搞明白了這個問題。

首先,使用如下sql語句建表:

CREATE TABLE test(id int);

然後使用mysql命令檢視建表語句

SHOW CREATE TABLE test

結果顯示如下:

enter image description here

這裡int自動的變成了int(11)。為什麼會這樣,還得從int(m)中的m指的是什麼來回答這個問題。

MySQL中int型別的取值範圍是固定的,帶符號範圍:-2 147 483 648~2 147 483 647 無符號範圍:0~4 294 967 295 。int(m)中的m值,只是決定在查詢時顯示中的最小長度,對於取值範圍沒有半毛錢的關係。比如將id欄位的屬性改為int(5) zerofill ,這個屬性的意思是,定義一個int型別的欄位,欄位值如果小於5位,高位用0填充。驗證如下,

enter image description here

通過結果可以看到,如果不足5位,在前面用0填充顯示,如果超出5位數,對長度也沒有任何影響。知道了(m)的作用,那麼再來說說為什麼MySQL會預設給11位,數一數int取值範圍的最大值和帶符號範圍的最小值發現剛好是10位數,因為還要給顯示符號留一位,所以預設就是int(11)嘍。

m的取值範圍是多少?在int型別的欄位上賦超過範圍的值會報什麼樣的錯誤?大家都可以去嘗試一下。

如果讀到這裡,認為我想表達的是“實踐出真理”嗎?不不不,我想說,實踐固然重要,但是閱讀官方文件更重要。官方的才是最正經的。對於本文的問題,官網文件中給出了明確的說明。

enter image description here

相關文章