注意: 比如:
tinyint(2)并不是隻能存0到99的數字,還可以存:0到255的數字。
int(2)并不是隻能存0到99的數字,還可以存:0到4294967295的數字。
它這括号裡的長度跟char(2)、varchar(2)括号裡面的長度意思不一樣。
我的朋友海濱問我mysql在建表的時候int類型後的長度代表什麼? 是該列允許存儲值的最大寬度嗎? 為什麼我設定成int(1), 也一樣能存10,100,1000呢.
當時我雖然知道int(1),這個長度1并不代表允許存儲的寬度,但卻沒有一個合理的解釋. 或者說對這個長度也沒有真正的研究過到底代表什麼, 平時都用int(11), 也不知道為什麼要11位. 是以我在網上查閱了一些資料, 也仔細的看了mysql手冊關于int data type的說法.
以下是每個整數類型的存儲和範圍(來自mysql手冊)
類型
位元組
最小值
最大值
(帶符号的/無符号的)
TINYINT
1
-128
127
255
SMALLINT
2
-32768
32767
65535
MEDIUMINT
3
-8388608
8388607
16777215
INT
4
-2147483648
2147483647
4294967295
BIGINT
8
-9223372036854775808
9223372036854775807
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了, 其實不是這個意思.
這也就能解釋以上标紅的話.
我們把這個字段的"屬性"修改為UNSIGNED ZEROFILL看一下效果.
我們看到現在我的number字段, 長度(M)=5, 屬性=UNSIGNED ZEROFILL(無符号,用0來填充位數), 設定這個屬性後我往表時插入資料,系統會自動把number字段M不夠5位的在左側用0來填充; 效果如下
但有一點看完該文檔你應該清楚的知道, 長度M與你存放的數值型的數的大小無關.
本文轉自許琴 51CTO部落格,原文連結:http://blog.51cto.com/xuqin/1339666,如需轉載請自行聯系原作者