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