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

2021-08-24 20:22:45 字數 1883 閱讀 8450

我的朋友海濱問我mysql在建表的時候int型別後的長度代表什麼? 是該列允許儲存值的最大寬度嗎? 為什麼我設定成int(1), 也一樣能存10,100,1000呢.

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

以下是每個整數型別的儲存和範圍(來自mysql手冊)

型別

位元組

最小值

最大值

(帶符號的/無符號的)

(帶符號的/無符號的)

tinyint

-128

smallint

-32768

mediumint

-8388608

int-2147483648

bigint

-9223372036854775808

**一共有四列分別表式:字段型別, 占用位元組數, 允許儲存的最小值, 允許儲存的最大值.

我們拿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。顯示寬度與儲存大小或型別包含的值的範圍無關;

這個m=5我們可以簡單的理解成為, 我們建立這個長度是為了告訴mysql資料庫我們這個欄位的儲存的資料的寬度為5位數,  當然如果你不是5位數(只要在該型別的儲存範圍之內)mysql也能正常儲存,  這也就能解釋以上標紅的話.

我們把這個欄位的"屬性"修改為unsigned zerofill看一下效果.

我們看到現在我的number欄位, 長度(m)=5, 屬性=unsigned zerofill(無符號,用0來填充位數),  設定這個屬性後我往表時插入資料,系統會自動把number欄位m不夠5位的在左側用0來填充; 效果如下

手冊上還有這麼一句話"當 mysql 為某些複雜的聯結(join)生成臨時表時,你可能會遇到問題,因為在這種情況下,mysql 信任地認為所有的值均適合原始的列寬度". 這也讓我不禁感嘆這個寬度到底如何設定比較合適?

但有一點看完該文件你應該清楚的知道, 長度m與你存放的數值型的數的大小無關.

詳解mysql int型別的長度值

mysql在建表的時候int型別後的長度代表什麼?是該列允許儲存值的最大寬度嗎?為什麼我設定成int 1 也一樣能存10,100,1000呢.當時我雖然知道int 1 這個長度1並不代表允許儲存的寬度,但卻沒有乙個合理的解釋.或者說對這個長度也沒有真正的研究過到底代表什麼,平時都用int 11 也不...

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

參考 mysql在建表的時候int型別後的長度代表什麼?是該列允許儲存值的最大寬度嗎?為什麼我設定成int 1 也一樣能存10,100,1000呢.當時我雖然知道int 1 這個長度1並不代表允許儲存的寬度,但卻沒有乙個合理的解釋.或者說對這個長度也沒有真正的研究過到底代表什麼,平時都用int 11...

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

以下是每個整數型別的儲存和範圍 來自mysql手冊 型別 位元組 最小值 最大值 帶符號的 無符號的 帶符號的 無符號的 tinyint 1 128 127 0255 smallint 2 32768 32767 065535 mediumint 3 8388608 8388607 01677721...