互聯網大廠面試:MySQL中int(11)和int(10)有什么區別?
我們在平時創建MySQL表時,會指定各種字段的類型,比如id int(11),name varchar(20)。
那不知道大家細想過沒有,int(11)和int(10)有什么區別呢?存儲的數值范圍有什么不一樣嗎??
對于字符串類型的定義name varchar(20),我們可以清楚的知道,這是表示name這個字段最大長度是20個字符,當name字段的長度超過20字符時,MySQL就會報錯。
那么對于int類型來說,當定義為無符號int時,最大取值范圍是4294967295,數一下長度也就10位,那么難道我們定義int(11)的時候,可以突破int類型的取值上限了嗎?
另外有些細心的朋友可能會發現,我們在創建表時,如果沒有指定int類型的length,MySQL會自動幫我們指定length為int(10)。如果我們指定了int(x),那么length就會被定義為x。
其實,對于int類型來說,其最大值和最小值都是固定的,定義的int(x)中x代表的并不是長度,而是顯示寬度。
當定義一個無符號int類型,且設置了ZEROFILL屬性時,如果數值的長度沒有達到顯示的寬度時,MySQL會自動的在數值前面補零直至達到定義的寬度。
我們新建一個表test驗證一下。
大家可以看到我將id的length定義為了8,這是為了讓大家看到當存儲的數值超過8的顯示結果。desc查看表結構如下:
我們插入兩條數據,看一下具體的顯示效果。
兩條記錄的主鍵分別為1和10001000,select看一下MySQL是如何顯示的。
可以看到,第一條記錄,由于顯示的寬度只有1,MySQL對其在左邊補了7個0,
而對于第二條記錄,其顯示寬度是8,MySQL沒有做什么改變。
也就說,當存儲的數據寬度不夠時,MySQL才會在左邊補零。
那么問題又來了,MySQL引擎在存儲數據的時候,存的是1呢,還是00000001呢?
很明顯,存儲的是1,00000001只是用來給我們顯示用的。
另外需要大家注意的是,zerofill填充只對正數起作用,因為ZEROFILL屬性會隱式地將數值轉為無符號型。
所以總結一下就是,int(x)中的x代表是其寬度,其寬度值并不會影響存儲的范圍,而只是根據定義的寬度進行了顯示的格式化而已。
而int類型寬度可以定義的范圍是多少呢?-1~10485760。
最后,再問大家一個問題吧,寬度的格式化是MySQL的Server來做的,還是InnoDB引擎做的呢?