mysql欄位型別tinyint、smallint、mediumint、int、bigint詳解
mysql建模的過程中,對於優化來講一個非常重要的點就是欄位型別的設定,好的欄位型別的設定可以幫助更快的查詢資料同時能節約硬碟空間,這對於優化資料庫來講是非常重要的。
mysql的欄位型別大體來講分為int、text、varchar、char、blog等幾種,而各自的型別中又劃分了不同的字元數的型別,這裡先來討論幾種整形的情況。
先來看一下基本的概念:位元組(byte),1個位元組等於8個位(bit),一個bit儲存0或者1,理解這個對於理解後面的佔用位元組導致的儲存數值的有很重要的作用。
整型,常見細分為tinyint、smallint、mediumint、int、bigint這幾種。
1)tinyint:
2)smallint:儲存所佔兩個位元組,同上也就是可以儲存2的16次方,也就是可以儲存65536種可能性,無符號從0開始則是可以儲存0~65535,有符號則是-32768~32767。
3)mediumint:儲存所佔三個位元組,也就是2的24次方,可以儲存16777216種可能性,無符號可以儲存0~16777215,有符號可以儲存-8388608~8388607。
4)int:
5)bigint:儲存所佔8個位元組,也就是2的64次方,可以儲存2的64次種可能性,無符號可以儲存0~((2³²×²)-1),有符號則是-(2³²×²)/2 ~ (2³²×²)/2-1。
我們經常會見到int(11)、tinyint(1)這種後面跟括號裡面放數字的情況,很多人以為這是代表的該型別可儲存的長度,但是我們上面已經分析了儲存的情況,這種理解肯定是不對的,實際上括號裡的數字表示的是最大顯示寬度,這個數字和儲存大小及其型別沒有任何關係,也就是說tinyint(1)和tinyint(3)都是儲存一個位元組,並不會因為括號裡的數字改變,這個數字僅僅是顯示最大寬度。
例如tinyint(3)儲存11則會顯示011,因為最大寬度為3,達不到的情況下用0來補充,這樣的話就很好理解了,下圖也是做了一定的對比,分別儲存的是1和123456、1234567890這幾個數字。
在設定這個括號裡的數值時我們也要小心,因為mysql手冊上明確寫了:當 mysql 為某些複雜的聯結(join)生成臨時表時,你可能會遇到問題,因為在這種情況下,mysql 信任地認為所有的值均適合原始的列寬度!