長度范圍是隨數據類型就已經是固定的值,而顯示寬度與長度范圍無關。
以下是每個整數類型的存儲和范圍(來自MySQL手冊)
類型 |
字節 |
最小值 |
最大值 |
|
|
(帶符號的/無符號的) |
(帶符號的/無符號的) |
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 |
表格一共有四列分別表式:字段類型,占用字節數,允許存儲的最小值,允許存儲的最大值。
我們拿int類型為例:
int類型,占用字節數為4byte,學過計算機原理的同學應該知道,字節(byte)並非是計算機存儲的最小單位,還有比字節(byte)更小的單位,也就是位(bit),一個位就代表一個0或1; 8個位組成一個字節; 一般字節用大寫B來表示byte,位用小寫b來表示bit。
計算機存儲單位的換算:
1B=8b
1KB=1024B
1MB=1024KB
那么根據int類型允許存儲的字節數是4個字節,我們就能換算出int UNSIGNED(無符號)類型的能存儲的最小值為0,最大值為4294967295(即4B=32b,最大值即為32個1組成);
接下來我們再說說我們建表時的字段長度到底是怎么一回事。
CREATE TABLE `test` ( `id` INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, `number` INT(5) NOT NULL ) ENGINE = MYISAM;
以test表的number字段為例,大家看到我建的是int(5)
MySQL手冊中這個長度/值用"M"來表示的。 細心的朋友應該有注意到過MySQL手冊上有這么一句話: M指示最大顯示寬度。最大有效顯示寬度是255。顯示寬度與存儲大小或類型包含的值的范圍無關;
這句話看上去不太容易理解,因為這里有個關鍵詞容易讓我們混淆,"最大顯示寬度"我們第一反應是該字段的值最大能允許存放的值的寬度。 以為我們建了int(1),就不能存放數據10了,其實不是這個意思。
這個M=5我們可以簡單的理解成為,我們建立這個長度是為了告訴MySQL數據庫我們這個字段的存儲的數據的寬度為5位數, 當然如果你不是5位數(只要在該類型的存儲范圍之內)MySQL也能正常存儲, 這也就能解釋以上標紅的話。
我們把這個字段的"屬性"修改為UNSIGNED ZEROFILL看一下效果。
我們看到現在我的number字段,長度(M)=5,屬性=UNSIGNED ZEROFILL(無符號,用0來填充位數), 設置這個屬性后我往表時插入數據,系統會自動把number字段M不夠5位的在左側用0來填充; 效果如下
手冊上還有這么一句話"當 MySQL 為某些復雜的聯結(join)生成臨時表時,你可能會遇到問題,因為在這種情況下,MySQL 信任地認為所有的值均適合原始的列寬度"。 這也讓我不禁感嘆這個寬度到底如何設置比較合適?
但有一點看完該文檔你應該清楚的知道,長度M與你存放的數值型的數的大小無關。
參考:
http://www。cnblogs。com/echo-something/archive/2012/08/26/MySQL_int。html(以上內容轉自此篇文章)