最近使用mysql數(shù)據(jù)庫的時(shí)候遇到了多種數(shù)字的類型,主要有int,bigint,smallint和tinyint。其中比較迷惑的是int和smallint的差別。今天就在網(wǎng)上仔細(xì)找了找,找到如下內(nèi)容,留檔做個(gè)總結(jié):
使用整數(shù)數(shù)據(jù)的精確數(shù)字?jǐn)?shù)據(jù)類型。
bigint
從 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型數(shù)據(jù)(所有數(shù)字)。存儲(chǔ)大小為 8 個(gè)字節(jié)。
P.S. bigint已經(jīng)有長(zhǎng)度了,在mysql建表中的length,只是用于顯示的位數(shù)
int
從 -2^31 (-2,147,483,648) 到 2^31 – 1 (2,147,483,647) 的整型數(shù)據(jù)(所有數(shù)字)。存儲(chǔ)大小為 4 個(gè)字節(jié)。int 的 SQL-92 同義字為 integer。
smallint
從 -2^15 (-32,768) 到 2^15 – 1 (32,767) 的整型數(shù)據(jù)。存儲(chǔ)大小為 2 個(gè)字節(jié)。
tinyint
從 0 到 255 的整型數(shù)據(jù)。存儲(chǔ)大小為 1 字節(jié)。
在支持整數(shù)值的地方支持 bigint 數(shù)據(jù)類型。但是,bigint 用于某些特殊的情況,當(dāng)整數(shù)值超過 int 數(shù)據(jù)類型支持的范圍時(shí),就可以采用 bigint。在 SQL Server 中,int 數(shù)據(jù)類型是主要的整數(shù)數(shù)據(jù)類型。
在數(shù)據(jù)類型優(yōu)先次序表中,bigint 位于 smallmoney 和 int 之間。
只有當(dāng)參數(shù)表達(dá)式是 bigint 數(shù)據(jù)類型時(shí),函數(shù)才返回 bigint。SQL Server 不會(huì)自動(dòng)將其它整數(shù)數(shù)據(jù)類型(tinyint、smallint 和 int)提升為 bigint。
int(M) 在 integer 數(shù)據(jù)類型中,M 表示最大顯示寬度。在 int(M) 中,M 的值跟 int(M) 所占多少存儲(chǔ)空間并無任何關(guān)系。和數(shù)字位數(shù)也無關(guān)系 int(3)、int(4)、int(8) 在磁盤上都是占用 4 btyes 的存儲(chǔ)空間。
在MySQL的數(shù)據(jù)類型中,Tinyint的取值范圍是:帶符號(hào)的范圍是-128到127。
Tinyint占用1字節(jié)的存儲(chǔ)空間,即8位(bit)。那么Tinyint的取值范圍怎么來的呢?我們先看無符號(hào)的情況。無符號(hào)的最小值即全部8位(bit)都為0,換算成十進(jìn)制就是0,所以無符號(hào)的Tinyint的最小值為0.無符號(hào)的最大值即全部8bit都為1,11111111,換算成十進(jìn)制就是255.這很好理解。
有符號(hào)的Tinyint的取值范圍是怎么來的呢?在計(jì)算機(jī)中,用最高位表示符號(hào)。0表示正,1表示負(fù),剩下的表示數(shù)值。那么有符號(hào)的8bit的最小值就是
1 1 1 1 1 1 1 1=-127
表示負(fù)值
最大值:
0 1 1 1 1 1 1 1=+127
表示正值
怎么有符號(hào)的最小值是-127,而不是-128呢?這就是本文要說的關(guān)鍵地方了,在計(jì)算機(jī)中,表示負(fù)值是用補(bǔ)碼
為什么有符號(hào)的TINYINT的最小值是-128?雖然“-0”也是“0”,但根據(jù)正、反、補(bǔ)碼體系,“-0”的補(bǔ)碼和“+0”是不同的,這樣就出現(xiàn)兩個(gè)補(bǔ)碼代表一個(gè)數(shù)值的情況。為了將補(bǔ)碼與數(shù)字一一對(duì)應(yīng),所以人為規(guī)定“0”一律用“+0”代表。同時(shí)為了充分利用資源,就將原來本應(yīng)該表示“-0”的補(bǔ)碼規(guī)定為代表-128
1 bytes = 8 bit ,一個(gè)字節(jié)最多可以代表的數(shù)據(jù)長(zhǎng)度是2的8次方 11111111 在計(jì)算機(jī)中也就是
-128到127
1.BIT[M]
位字段類型,M表示每個(gè)值的位數(shù),范圍從1到64,如果M被忽略,默認(rèn)為1
2.TINYINT[(M)] [UNSIGNED] [ZEROFILL] M默認(rèn)為4
很小的整數(shù)。帶符號(hào)的范圍是-128到127。無符號(hào)的范圍是0到255。
3. BOOL,BOOLEAN
是TINYINT(1)的同義詞。zero值被視為假。非zero值視為真。
4.SMALLINT[(M)] [UNSIGNED] [ZEROFILL] M默認(rèn)為6
小的整數(shù)。帶符號(hào)的范圍是-32768到32767。無符號(hào)的范圍是0到65535。
5.MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL] M默認(rèn)為9
中等大小的整數(shù)。帶符號(hào)的范圍是-8388608到8388607。無符號(hào)的范圍是0到16777215。
6. INT[(M)] [UNSIGNED] [ZEROFILL] M默認(rèn)為11
普通大小的整數(shù)。帶符號(hào)的范圍是-2147483648到2147483647。無符號(hào)的范圍是0到4294967295。
7.BIGINT[(M)] [UNSIGNED] [ZEROFILL] M默認(rèn)為20
大整數(shù)。帶符號(hào)的范圍是-9223372036854775808到9223372036854775807。無符號(hào)的范圍是0到18446744073709551615。
注意:這里的M代表的并不是存儲(chǔ)在數(shù)據(jù)庫中的具體的長(zhǎng)度,以前總是會(huì)誤以為int(3)只能存儲(chǔ)3個(gè)長(zhǎng)度的數(shù)字,int(11)就會(huì)存儲(chǔ)11個(gè)長(zhǎng)度的數(shù)字,這是大錯(cuò)特錯(cuò)的。
tinyint(1) 和 tinyint(4) 中的1和4并不表示存儲(chǔ)長(zhǎng)度,只有字段指定zerofill是有用,
如tinyint(4),如果實(shí)際值是2,如果列指定了zerofill,查詢結(jié)果就是0002,左邊用0來填充。
---------------------
char是一種固定長(zhǎng)度的類型,varchar則是一種可變長(zhǎng)度的類型,它們的區(qū)別是:
char(M)類型的數(shù)據(jù)列里,每個(gè)值都占用M個(gè)字節(jié),如果某個(gè)長(zhǎng)度小于M,MySQL就會(huì)在它的右邊用空格字符補(bǔ)足.
(在檢索操作中那些填補(bǔ)出來的空格字符將被去掉)
在varchar(M)類型的數(shù)據(jù)列里,每個(gè)值只占用剛好夠用的字節(jié)再加上一個(gè)用來記錄其長(zhǎng)度的字節(jié)(即總長(zhǎng)度為L(zhǎng)+1字節(jié)).
在MySQL中用來判斷是否需要進(jìn)行對(duì)據(jù)列類型轉(zhuǎn)換的規(guī)則
1、在一個(gè)數(shù)據(jù)表里,如果每一個(gè)數(shù)據(jù)列的長(zhǎng)度都是固定的,那么每一個(gè)數(shù)據(jù)行的長(zhǎng)度也將是固定的.
2、只要數(shù)據(jù)表里有一個(gè)數(shù)據(jù)列的長(zhǎng)度的可變的,那么各數(shù)據(jù)行的長(zhǎng)度都是可變的.
3、如果某個(gè)數(shù)據(jù)表里的數(shù)據(jù)行的長(zhǎng)度是可變的,那么,為了節(jié)約存儲(chǔ)空間,MySQL會(huì)把這個(gè)數(shù)據(jù)表里的固定長(zhǎng)度類型的數(shù)據(jù)列轉(zhuǎn)換為相應(yīng)的可變長(zhǎng)度類型.
例外:長(zhǎng)度小于4個(gè)字符的char數(shù)據(jù)列不會(huì)被轉(zhuǎn)換為varchar類型
如對(duì)本文有疑問,請(qǐng)?zhí)峤坏浇涣髡搲瑥V大熱心網(wǎng)友會(huì)為你解答?。?點(diǎn)擊進(jìn)入論壇