關于int的長度
很多時候看到int(8)這樣的定義,其實這是工具導出的不專業。
int是范圍,不是長度。
在開發有了共識(知道這個長度不算數,要看范圍)以后,上來就是所有的類型都是bigint。
int的范圍
- int的取值范圍是
- TINYINT:占用1個字節(8位),取值范圍是-128到127(有符號),或者0到255(無符號)。
- SMALLINT:占用2個字節(16位),取值范圍是-32,768到32,767(有符號),或者0到65,535(無符號)。
- MEDIUMINT:占用3個字節(24位),取值范圍是-8,388,608到8,388,607(有符號),或者0到16,777,215(無符號)。
- INT 或 INTEGER:占用4個字節(32位),取值范圍是-2,147,483,648到2,147,483,647(有符號),或者0到4,294,967,295(無符號)。
- BIGINT:占用8個字節(64位),取值范圍是-9,223,372,036,854,775,808到9,223,372,036,854,775,807(有符號),或者0到18,446,744,073,709,551,615(無符號)。
- 總之占位字節越多,性能就越不好。所以都是bigint不太合適
我個人建議
- MySQL的表,如果要自增ID當主鍵的,那么就是用int就行。可以放21億條數據。現如今99.99%的系統中的數據表沒這么多數據。如果想再多一點用無符號的,那么就能擴大到42億條數據。現如今99.9999%的系統中的數據表沒這么多數據。
- 問題來了,如果一開始沒設置無符號,到了21億的范圍會如何?
- 答案是寫不進去了。
- 追問,這個時候改還來得及嗎?
- 答案是,可以。
實操測試
- 在MySQL中當列有數據庫的時候改類型是可以的。(不是所有都這樣,Oracle就不允許)
- 在b列有數據的時候改類型。成功。
- 在這個基礎上給id列寫入最大值以及模擬越界。
- 可以看出,在2147483647的時候還可以寫入。但是到了2147483648的時候不行了。
- 這時候把int列改成無符號型,又可以寫入了。理論寫入42億條。