以下各節(jié)描述了MySQL支持的數(shù)據(jù)類(lèi)型。
MySQL支持三種類(lèi)型的數(shù)據(jù)類(lèi)型:字符串,數(shù)字和日期/時(shí)間數(shù)據(jù)類(lèi)型。
字符串?dāng)?shù)據(jù)類(lèi)型通常用于存儲(chǔ)名稱(chēng),地址,描述或任何包含字母和數(shù)字的值,包括二進(jìn)制數(shù)據(jù),例如圖像或音頻文件。
CHAR數(shù)據(jù)類(lèi)型允許存儲(chǔ)最大為255個(gè)字符的固定長(zhǎng)度字符串。而VARCHAR數(shù)據(jù)類(lèi)型允許存儲(chǔ)最大為65,535個(gè)字符的可變長(zhǎng)度字符串(在MySQL 5.0.3之前限制為255個(gè)字符)。
CHAR和VARCHAR數(shù)據(jù)類(lèi)型聲明的長(zhǎng)度表示希望存儲(chǔ)的最大字符數(shù)。例如,CHAR(5)最多可以容納5個(gè)字符。
CHAR和VARCHAR數(shù)據(jù)類(lèi)型之間的主要區(qū)別是它們存儲(chǔ)數(shù)據(jù)的方式。當(dāng)值存儲(chǔ)在CHAR列中時(shí),將用指定長(zhǎng)度的空格右填充,但在VARCHAR列中存儲(chǔ)值時(shí)將不對(duì)其進(jìn)行填充。這意味著,如果將值“ ab” CHAR(4)存儲(chǔ)在VARCHAR(4)列中,則該值將被存儲(chǔ)為“ ab”,而相同的值將被存儲(chǔ)為“ ab”。
提示:使用CHAR數(shù)據(jù)類(lèi)型來(lái)存儲(chǔ)具有固定長(zhǎng)度的值,例如國(guó)家/地區(qū)代碼。對(duì)于名稱(chēng)或標(biāo)題等長(zhǎng)度可變的值,VARCHAR可以節(jié)省空間。
注意:VARCHAR的有效最大長(zhǎng)度受最大行大小(65,535字節(jié),由所有列共享)和所使用的字符集的限制。
BINARY和VARBINARY類(lèi)型類(lèi)似于CHAR和VARCHAR,不同之處在于它們包含二進(jìn)制字符串而不是非二進(jìn)制字符串。 BINARY和VARBINARY的最大允許長(zhǎng)度與CHAR和VARCHAR相同,不同之處在于BINARY和VARBINARY的長(zhǎng)度以字節(jié)為單位,而不是以字符為單位。
TEXT和BLOB數(shù)據(jù)類(lèi)型專(zhuān)門(mén)用于保存大量數(shù)據(jù)。 TEXT數(shù)據(jù)類(lèi)型用于存儲(chǔ)長(zhǎng)字符串,如描述,博客評(píng)論等。
BLOB是一個(gè)二進(jìn)制大對(duì)象,可以容納可變數(shù)量的數(shù)據(jù)。 當(dāng)您需要在數(shù)據(jù)庫(kù)中存儲(chǔ)二進(jìn)制媒體文件(例如圖像或音頻文件)時(shí),此功能特別有用。
四種BLOB類(lèi)型是TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。它們的區(qū)別僅在于它們所能容納的值的最大長(zhǎng)度。同樣,這四種文本類(lèi)型是TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT。這些對(duì)應(yīng)于四種BLOB類(lèi)型,具有相同的最大長(zhǎng)度和存儲(chǔ)需求。
下表列出了成對(duì)出現(xiàn)的MySQL字符串?dāng)?shù)據(jù)類(lèi)型。無(wú)論類(lèi)型是二進(jìn)制還是非二進(jìn)制,最大長(zhǎng)度都以字節(jié)為單位。
二進(jìn)制數(shù)據(jù)類(lèi)型 | 非二進(jìn)制數(shù)據(jù)類(lèi)型 | 最大長(zhǎng)度 |
---|---|---|
BINARY | CHAR | 255 |
VARBINARY | VARCHAR | 65,535 |
TINYBLOB | TINYTEXT | 255 |
BLOB | TEXT | 65,535 |
MEDIUMBLOB | MEDIUMTEXT | 16,777,215 |
LONGBLOB | LONGTEXT | 4,294,967,295 |
注意:對(duì)于非二進(jìn)制字符串?dāng)?shù)據(jù)類(lèi)型,列長(zhǎng)度值通常稱(chēng)為字符數(shù)而不是字節(jié)數(shù)。這意味著包含多字節(jié)字符的字符串的最大字符數(shù)更少。
ENUM數(shù)據(jù)類(lèi)型允許您指定可以存儲(chǔ)在列中的可能值的列表。 例如,指定為性別ENUM('male','female')NOT NULL的列可以具有以下任意值:'','male'或'female'。 您可以在ENUM列表中最多指定65,535個(gè)不同的值。 如果您在ENUM列中插入無(wú)效值(即,在允許值列表中不存在的字符串),則會(huì)插入空字符串。
SET數(shù)據(jù)類(lèi)型允許指定要插入到列中的值列表,比如枚舉。但是,與只允許選擇一個(gè)值的ENUM數(shù)據(jù)類(lèi)型不同,SET數(shù)據(jù)類(lèi)型允許從指定的值列表中選擇多個(gè)值。
例如,指定為option SET('one', 'two') NOT NULL的列可以存儲(chǔ)以下任何值:",'one', 'two'或'one,two'。用逗號(hào)分隔的多個(gè)值(,)。對(duì)于SET數(shù)據(jù)類(lèi)型,最多可以指定64個(gè)不同的值。
數(shù)值數(shù)據(jù)類(lèi)型通常用于存儲(chǔ)價(jià)格,薪水等數(shù)據(jù)。
MySQL支持SQL標(biāo)準(zhǔn)整數(shù)類(lèi)型INTEGER(或INT)和SMALLINT。MySQL也支持整數(shù)類(lèi)型TINYINT,MEDIUMINT和BIGINT作為擴(kuò)展SQL標(biāo)準(zhǔn)。下表顯示了每種整數(shù)類(lèi)型的范圍。
數(shù)據(jù)類(lèi)型 | 范圍(簽名) | 范圍(無(wú)符號(hào)) |
---|---|---|
TINYINT | -128 至 127 | 0 至 |
SMALLINT | -32768 至 32767 | 0 至 |
MEDIUMINT | -8388608 至 8388607 | 0 至 |
INT | -2147483648 至 2147483647 | 0 至 |
BIGINT | -9223372036854775808 至 9223372036854775807 | 0 至 |
數(shù)值數(shù)據(jù)類(lèi)型具有有SIGNED(符號(hào))和UNSIGNED(無(wú)符號(hào))的附加屬性。數(shù)值數(shù)據(jù)類(lèi)型在默認(rèn)情況下是有符號(hào)的,其范圍從負(fù)到正。向數(shù)值列添加UNSIGNED屬性不允許使用負(fù)數(shù),并向上移動(dòng)范圍,使最小值從0開(kāi)始,而不是從負(fù)數(shù)開(kāi)始。
DECIMAL和NUMERIC數(shù)據(jù)類(lèi)型是用來(lái)存儲(chǔ)準(zhǔn)確數(shù)值。這些數(shù)據(jù)類(lèi)型也稱(chēng)為“定點(diǎn)”或“精確值”類(lèi)型,通常在需要保持精確精度時(shí)使用,例如存儲(chǔ)像產(chǎn)品價(jià)格這樣的貨幣數(shù)據(jù)。在MySQL中,NUMERIC被實(shí)現(xiàn)為DECIMAL。
在聲明DECIMAL或NUMERIC列時(shí),可以指定精度和小數(shù)位數(shù),例如DECIMAL(P,S)或NUMERIC(P,S),其中P是精度,S是小數(shù)位數(shù)。 精度指定可以在列中存儲(chǔ)的最大位數(shù)(包括小數(shù)點(diǎn)后的位數(shù)),而小數(shù)位數(shù)表示可以存儲(chǔ)在小數(shù)點(diǎn)后的位數(shù)。 例如,價(jià)格DECIMAL(6,2)列可以存儲(chǔ)具有六位數(shù)字和兩個(gè)小數(shù)的任何值,即-9999.99到9999.99之間的值。
FLOAT和DOUBLE類(lèi)型表示近似的數(shù)值數(shù)據(jù)值。這就是為什么這些數(shù)據(jù)類(lèi)型也稱(chēng)為“浮點(diǎn)型”或“近似值”類(lèi)型
MySQL支持的語(yǔ)法:FLOAT(M,D)或DOUBLE PRECISION(M,D)。 在此,(M,D)表示總共可以存儲(chǔ)多達(dá)M位的值,其中D位可以在小數(shù)點(diǎn)后。 例如,顯示為FLOAT(7,3)的列顯示為-9999.999。 MySQL在存儲(chǔ)值時(shí)會(huì)進(jìn)行四舍五入,因此,如果將9999.0009插入FLOAT(7,3)列,則近似結(jié)果為9999.001。
注意:比較浮點(diǎn)值可能會(huì)導(dǎo)致問(wèn)題,因?yàn)樗鼈兪墙浦?,而不是精確值。因此,為了存儲(chǔ)可以用于比較的值,如price、salary等,請(qǐng)使用DECIMAL數(shù)據(jù)類(lèi)型。
日期和時(shí)間數(shù)據(jù)類(lèi)型通常用于存儲(chǔ)數(shù)據(jù),例如出生日期,雇用日期,在表內(nèi)創(chuàng)建或更新記錄時(shí)的日期和時(shí)間等。
DATE數(shù)據(jù)類(lèi)型用于存儲(chǔ)日期。MySQL DATE以'YYYY-MM-DD'格式存儲(chǔ)和檢索值,其中YYYY,MM和DD分別是時(shí)間的年,月和日部分。支持的范圍是“ 1000-01-01”至“ 9999-12-31”。
TIME數(shù)據(jù)類(lèi)型可以被用來(lái)存儲(chǔ)時(shí)間的日或時(shí)間間隔。MySQL TIME以以下'HH:MM:SS'格式存儲(chǔ)和檢索值,其中HH,MM和SS是時(shí)間的小時(shí),分鐘和秒部分(或'HHH:MM:SS'大小時(shí)數(shù)的格式)。支持的TIME值范圍是'-838:59:59'到'838:59:59'。
小時(shí)部分可能很大,因?yàn)樵贛ySQL中,該TIME類(lèi)型不僅可以用于存儲(chǔ)一天中的時(shí)間(必須少于24小時(shí)),而且還可以用于經(jīng)過(guò)的時(shí)間或兩個(gè)事件之間的時(shí)間間隔(可能遠(yuǎn)大于24小時(shí),甚至是負(fù)的)。
注意:默認(rèn)情況下,超出TIME范圍但有效的值將被裁剪到范圍的最近端點(diǎn)。例如,“ 860:00:00”將轉(zhuǎn)換為“ 838:59:59”。無(wú)效的TIME值將轉(zhuǎn)換為“ 00:00:00”。
DATETIME和TIMESTAMP數(shù)據(jù)類(lèi)型用于以'YYYY-MM-DD HH:MM:SS'格式存儲(chǔ)合并的日期和時(shí)間值。這些數(shù)據(jù)類(lèi)型通常用于存儲(chǔ)分發(fā)訂單時(shí)的日期和時(shí)間、在表中創(chuàng)建或修改一行時(shí)的數(shù)據(jù),等等。
這兩種數(shù)據(jù)類(lèi)型在許多方面類(lèi)似,但是有一些區(qū)別。DATETIME支持的范圍是'1000-01-01 00:00:00'到'9999-12-31 23:59:59'。然而,時(shí)間戳的范圍是'1970-01-01 00:00:01' UTC到'2038-01-19 03:14:07' UTC。
TIMESTAMP和DATETIME也具有特殊的自動(dòng)初始化和自動(dòng)更新屬性,但是這些屬性不適用于MySQL 5.6.5之前的DATETIMEM。
注意: MySQL將TIMESTAMP值從當(dāng)前時(shí)區(qū)轉(zhuǎn)換為UTC以進(jìn)行存儲(chǔ),然后從UTC轉(zhuǎn)換為當(dāng)前時(shí)區(qū)以進(jìn)行檢索。
YEAR數(shù)據(jù)類(lèi)型用于存儲(chǔ)在四位數(shù)年份值YYYY格式。
可以將其聲明為YEAR或YEAR(4)。支持的YEAR值范圍是1901至2155。無(wú)效YEAR值將轉(zhuǎn)換為0000。
注意:較舊的MySQL版本還允許使用來(lái)存儲(chǔ)兩位數(shù)的年份值YEAR(2),但現(xiàn)在已棄用,并且在MySQL 5.7.5中已刪除了對(duì)它的支持。