MySQL支持所有標(biāo)準(zhǔn)SQL數(shù)值數(shù)據(jù)類(lèi)型。這些類(lèi)型包括嚴(yán)格數(shù)值數(shù)據(jù)類(lèi)型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似數(shù)值數(shù)據(jù)類(lèi)型(FLOAT、REAL和DOUBLE PRECISION)。關(guān)鍵字INT是INTEGER的同義詞,關(guān)鍵字DEC是DECIMAL的同義詞。
BIT數(shù)據(jù)類(lèi)型保存位字段值,并且支持MyISAM、MEMORY、InnoDB和BDB表。
作為SQL標(biāo)準(zhǔn)的擴(kuò)展,MySQL也支持整數(shù)類(lèi)型TINYINT、MEDIUMINT和BIGINT。下面的表顯示了需要的每個(gè)整數(shù)類(lèi)型的存儲(chǔ)和范圍。
類(lèi)型 | 字節(jié) | 最小值 | 最大值 |
(帶符號(hào)的/無(wú)符號(hào)的) | (帶符號(hào)的/無(wú)符號(hào)的) | ||
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 |
MySQL還支持選擇在該類(lèi)型關(guān)鍵字后面的括號(hào)內(nèi)指定整數(shù)值的顯示寬度(例如,INT(4))。該可選顯示寬度規(guī)定用于顯示寬度小于指定的列寬度的值時(shí)從左側(cè)填滿(mǎn)寬度。
顯示寬度并不限制可以在列內(nèi)保存的值的范圍,也不限制超過(guò)列的指定寬度的值的顯示。
當(dāng)結(jié)合可選擴(kuò)展屬性ZEROFILL使用時(shí), 默認(rèn)補(bǔ)充的空格用零代替。例如,對(duì)于聲明為INT(5) ZEROFILL的列,值4檢索為00004。請(qǐng)注意如果在整數(shù)列保存超過(guò)顯示寬度的一個(gè)值,當(dāng)MySQL為復(fù)雜聯(lián)接生成臨時(shí)表時(shí)會(huì)遇到問(wèn)題,因?yàn)樵谶@些情況下MySQL相信數(shù)據(jù)適合原列寬度。
所有整數(shù)類(lèi)型可以有一個(gè)可選(非標(biāo)準(zhǔn))屬性UNSIGNED。當(dāng)你想要在列內(nèi)只允許非負(fù)數(shù)和該列需要較大的上限數(shù)值范圍時(shí)可以使用無(wú)符號(hào)值。
浮點(diǎn)和定點(diǎn)類(lèi)型也可以為UNSIGNED。同數(shù)類(lèi)型,該屬性防止負(fù)值保存到列中。然而,與整數(shù)類(lèi)型不同的是,列值的上范圍保持不變。
如果為一個(gè)數(shù)值列指定ZEROFILL,MySQL自動(dòng)為該列添加UNSIGNED屬性。
對(duì)于浮點(diǎn)列類(lèi)型,在MySQL中單精度值使用4個(gè)字節(jié),雙精度值使用8個(gè)字節(jié)。
FLOAT類(lèi)型用于表示近似數(shù)值數(shù)據(jù)類(lèi)型。SQL標(biāo)準(zhǔn)允許在關(guān)鍵字FLOAT后面的括號(hào)內(nèi)選擇用位指定精度(但不能為指數(shù)范圍)。MySQL還支持可選的只用于確定存儲(chǔ)大小的精度規(guī)定。0到23的精度對(duì)應(yīng)FLOAT列的4字節(jié)單精度。24到53的精度對(duì)應(yīng)DOUBLE列的8字節(jié)雙精度。
MySQL允許使用非標(biāo)準(zhǔn)語(yǔ)法:FLOAT(M,D)或REAL(M,D)或DOUBLE PRECISION(M,D)。這里,“(M,D)”表示該值一共顯示M位整數(shù),其中D位位于小數(shù)點(diǎn)后面。例如,定義為FLOAT(7,4)的一個(gè)列可以顯示為-999.9999。MySQL保存值時(shí)進(jìn)行四舍五入,因此如果在FLOAT(7,4)列內(nèi)插入999.00009,近似結(jié)果是999.0001。
MySQL將DOUBLE視為DOUBLE PRECISION(非標(biāo)準(zhǔn)擴(kuò)展)的同義詞。MySQL還將REAL視為DOUBLE PRECISION(非標(biāo)準(zhǔn)擴(kuò)展)的同義詞,除非SQL服務(wù)器模式包括REAL_AS_FLOAT選項(xiàng)。
為了保證最大可能的可移植性,需要使用近似數(shù)值數(shù)據(jù)值存儲(chǔ)的代碼應(yīng)使用FLOAT或DOUBLE PRECISION,不規(guī)定精度或位數(shù)。
DECIMAL和NUMERIC類(lèi)型在MySQL中視為相同的類(lèi)型。它們用于保存必須為確切精度的值,例如貨幣數(shù)據(jù)。當(dāng)聲明該類(lèi)型的列時(shí),可以(并且通常要)指定精度和標(biāo)度;例如:
salary DECIMAL(5,2)
在該例子中,5是精度,2是標(biāo)度。精度表示保存值的主要位數(shù),標(biāo)度表示小數(shù)點(diǎn)后面可以保存的位數(shù)。
在MySQL 5.1中以二進(jìn)制格式保存DECIMAL和NUMERIC值。
標(biāo)準(zhǔn)SQL要求salary列能夠用5位整數(shù)位和兩位小數(shù)保存任何值。因此,在這種情況下可以保存在salary列的值的范圍是從-999.99到999.99。
在標(biāo)準(zhǔn)SQL中,語(yǔ)法DECIMAL(M)等價(jià)于DECIMAL(M,0)。同樣,語(yǔ)法DECIMAL等價(jià)于DECIMAL(M,0),可以通過(guò)計(jì)算確定M的值。在MySQL 5.1中支持DECIMAL和NUMERIC數(shù)據(jù)類(lèi)型的變量形式。M默認(rèn)值是10。
DECIMAL或NUMERIC的最大位數(shù)是65,但具體的DECIMAL或NUMERIC列的實(shí)際范圍受具體列的精度或標(biāo)度約束。如果此類(lèi)列分配的值小數(shù)點(diǎn)后面的位數(shù)超過(guò)指定的標(biāo)度允許的范圍,值被轉(zhuǎn)換為該標(biāo)度。(具體操作與操作系統(tǒng)有關(guān),但一般結(jié)果均被截取到允許的位數(shù))。
BIT數(shù)據(jù)類(lèi)型可用來(lái)保存位字段值。BIT(M)類(lèi)型允許存儲(chǔ)M位值。M范圍為1到64。
要指定位值,可以使用b’value‘符。value是一個(gè)用0和1編寫(xiě)的二進(jìn)制值。例如,b’111′和b’100000000′分別表示7和128。參見(jiàn)9.1.5節(jié),“位字段值”。
如果為BIT(M)列分配的值的長(zhǎng)度小于M位,在值的左邊用0填充。例如,為BIT(6)列分配一個(gè)值b’101′,其效果與分配b’000101′相同。
當(dāng)要在一個(gè)數(shù)值列內(nèi)保存一個(gè)超出該列允許范圍的值時(shí),MySQL的操作取決于此時(shí)有效的SQL模式。如果模式未設(shè)置,MySQL將值裁剪到范圍的相應(yīng)端點(diǎn),并保存裁減好的值。但是,如果模式設(shè)置為traditional(“嚴(yán)格模式”),超出范圍的值將被拒絕并提示錯(cuò)誤,并且根據(jù)SQL標(biāo)準(zhǔn)插入會(huì)失敗。參見(jiàn)5.3.2節(jié),“SQL服務(wù)器模式”。
如果INT列是UNSIGNED,列范圍的大小相同,但其端點(diǎn)會(huì)變?yōu)榈?和4294967295。如果你試圖保存-9999999999和9999999999,以非嚴(yán)格模式保存到列中的值是0和4294967296。
如果在浮點(diǎn)或定點(diǎn)列中分配的值超過(guò)指定(或默認(rèn))精度和標(biāo)度規(guī)定的范圍,MySQL以非嚴(yán)格模式保存表示范圍相應(yīng)端點(diǎn)的值。
當(dāng)MySQL沒(méi)有工作在嚴(yán)格模式時(shí),對(duì)于ALTER TABLE、LOAD DATA INFILE、UPDATE和多行INSERT語(yǔ)句,由于裁剪發(fā)生的轉(zhuǎn)換將報(bào)告為警告。當(dāng)MySQL工作在嚴(yán)格模式時(shí),這些語(yǔ)句將失敗,并且部分或全部值不會(huì)插入或更改,取決于是否表為事務(wù)表和其它因素。詳情參見(jiàn)5.3.2節(jié),“SQL服務(wù)器模式”。
參考:http://dev.mysql.com/doc/refman/5.1/zh/column-types.html#numeric-types
簡(jiǎn)單點(diǎn)說(shuō):
int(11)和int(3),對(duì)內(nèi)部存儲(chǔ)沒(méi)有任何影響,包括可保存值范圍,使用的存儲(chǔ)空間;只是在某些應(yīng)用需要的時(shí)候,返回至少是int(M) M寬度的數(shù)值,英文原文如下:
MySQL supports an extension for optionally specifying the display width of integer data types in parentheses following the base keyword for the type. For example, INT(4) specifies an INT with a display width of four digits. This optional display width may be used by applications to display integer values having a width less than the width specified for the column by left-padding them with spaces. (That is, this width is present in the metadata returned with result sets. Whether it is used or not is up to the application.)
The display width does not constrain the range of values that can be stored in the column. Nor does it prevent values wider than the column display width from being displayed correctly. For example, a column specified as SMALLINT(3) has the usual SMALLINT range of -32768 to 32767, and values outside the range permitted by three digits are displayed in full using more than three digits.
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com