詳解mysql int類型的長度值問題

個人朋友海濱問我mysql在建表的時候int類型後的長度表明什麼? 是該列容許存儲值的最大寬度嗎? 爲何我設置成int(1), 也同樣能存10,100,1000呢.html

當時我雖然知道int(1),這個長度1並不表明容許存儲的寬度,但卻沒有一個合理的解釋. 或者說對這個長度也沒有真正的研究過到底表明什麼, 平時都用int(11), 也不知道爲何要11位. 因此我在網上查閱了一些資料, 也仔細的看了mysql手冊關於int data type的說法.mysql

 

如下是每一個整數類型的存儲和範圍(來自mysql手冊)sql

類型數據庫

字節spa

最小值code

最大值htm

 

 

(帶符號的/無符號的)blog

(帶符號的/無符號的)文檔

TINYINTit

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

相關文章
相關標籤/搜索