表1:數值列類型
每種數實值型別的名稱和取值範圍如表2所示。
類型說明 |
取值範圍 |
TINYINT[(M)] |
有符號值:-128 到127(- 27 到27 - 1) 無符號值:0到255(0 到28 - 1) |
SMALLINT[(M)] |
有符號值:-32768 到32767(- 215 到215 - 1) 無符號值:0到65535(0 到21 6 - 1) |
MEDIUMINT[(M)] |
有符號值:-8388608 到8388607(- 22 3 到22 3 - 1 ) 無符號值:0到16777215(0 到22 4 - 1) |
INT[(M)] |
有符號值:-2147683648 到2147683647(- 231 到231- 1) 無符號值:0到42Array4Array672Array5(0 到232 - 1) |
BIGINT[(M)] |
有符號值:-Array223372036854775808到Array223373036854775807(- 263到263-1) 無符號值:0到1844674407370Array551615(0到264 ? 1) |
FLOAT[(M, D)] |
最小非零值:±1.1754Array4351E - 38 |
DOUBLE[(M,D)] |
最小非零值:±2.2250738585072014E - 308 |
DECIMAL (M, D) |
可變;其值的範圍依賴於M 和D |
表2:數值列類型的取值範圍
各種類型值所需的儲存量如表3所示。
類型說明 |
儲存需求 |
TINYINT[(M)] |
1位元組 |
SMALLINT[(M)] |
2位元組 |
MEDIUMINT[(M)] |
3位元組 |
INT[(M)] |
4位元組 |
BIGINT[(M)] |
8位元組 |
FLOAT[(M, D)] |
4位元組 |
DOUBLE[(M, D)] |
8位元組 |
DECIMAL (M, D) |
M位元組(MySQL < 3.23),M+2位元組(MySQL > 3.23 ) |
表3:數值列類型的儲存需求
MySQL提供了五種整型: TINYINT、SMALLINT、MEDIUMINT、INT和BIGINT。INT為INTEGER的縮寫。這些類型在可表示的取值範圍上是不同的。整數列可定義為UNSIGNED從而禁用負值;這使列的取值範圍為0以上。各種類型的儲存量需求也是不同的。取值範圍較大的類型所需的儲存量較大。
MySQL 提供三種浮點類型: FLOAT、DOUBLE和DECIMAL。與整型不同,浮點類型不能是UNSIGNED的,其取值範圍也與整型不同,這種不同不僅在於這些類型有最大值,而且還有最小非零值。最小值提供了相應類型精度的一種度量,這對於記錄科學資料來說是非常重要的(當然,也有負的最大和最小值)。
在選擇了某種數實值型別時,應該考慮所要表示的值的範圍,只需選擇能覆蓋要取值的範圍的最小類型即可。選擇較大類型會對空間造成浪費,使表不必要地增大,處理起來沒有選擇較小類型那樣有效。對於整型值,如果資料取值範圍較小,如人員年齡或兄弟姐妹數,則TINYINT最合適。MEDIUMINT能夠表示數百萬的值並且可用於更多類型的值,但儲存代價較大。BIGINT在全部整型中取值範圍最大,而且需要的儲存空間是表示範圍次大的整型INT類型的兩倍,因此只在確實需要時才用。對於浮點值,DOUBLE佔用FLOAT的兩倍空間。除非特別需要高精度或範圍極大的值,一般應使用只用一半儲存代價的FLOAT型來表示資料。
在定義整型列時,可以指定可選的顯示尺寸M。如果這樣,M應該是一個1 到255的整數。它表示用來顯示列中值的字元數。例如,MEDIUMINT(4)指定了一個具有4個字元顯示寬度的MEDIUMINT列。如果定義了一個沒有明確寬度的整數列,將會自動分配給它一個預設的寬度。預設值為每種類型的“最長”值的長度。如果某個特定值的可列印表示需要不止M個字元,則顯示完全的值;不會將值截斷以適合M個字元。
對每種浮點類型,可指定一個最大的顯示尺寸M 和小數位元D。M 的值應該取1 到255。D的值可為0 到3 0,但是不應大於M - 2(如果熟悉ODBC 術語,就會知道M 和D 對應於ODBC 概念的“精度”和“小數點位元”)。M和D對FLOAT和DOUBLE 都是可選的,但對於DECIMAL是必須的。在選項M 和D時,如果省略了它們,則使用預設值。
2.2字串列類型
MySQL提供了幾種存放字元資料的串類型,其類型如下:
類型名 |
說明 |
CHAR |
定長字串 |
VARCHAR |
可變長字串 |
TINYBLOB |
非常小的BLOB(二進位大對象) |
BLOB |
小BLOB |
MEDIUMBLOB |
中等的BLOB |
LONGBLOB |
大BLOB |
TINYTEXT |
非常小的文本串 |
TEXT |
小文本串 |
MEDIUMTEXT |
中等文本串 |
LONGTEXT |
大文本串 |
ENUM |
枚舉;列可賦予某個枚舉成員 |
SET |
集合;列可賦予多個集合成員 |
表4:字串列類型
下表給出了MySQL 定義串值列的類型,以及每種類型的最大尺寸和儲存需求。對於可變長的列類型,各行的值所佔的儲存量是不同的,這取決於實際存放在列中的值的長度。這個長度在表中用L 表示。
類型說明 |
最大尺寸 |
儲存需求 |
CHAR( M) |
M 位元組 |
M 位元組 |
VARCHAR(M) |
M 位元組 |
L + 1位元組 |
TINYBLOB, TINYTEXT |
28- 1位元組 |
L + 1位元組 |
BLOB, TEXT |
216 - 1 位元組 |
L + 2位元組 |
MEDIUMBLOB, MEDIUMTEXT |
224- 1位元組 |
L + 3位元組 |
LONGBLOB, LONGTEXT |
232- 1位元組 |
L + 4位元組 |
ENUM(“value1”, “value2”, ...) |
65535 個成員 |
1 或2位元組 |
SET (“value1”, “value2”, ...) |
64個成員 |
1、2、3、4 或8位元組 |
表5:串列類型最大尺寸及儲存需求
L 以外所需的額外位元組為存放該值的長度所需的位元組數。MySQL 通過儲存值的內容及其長度來處理可變長度的值。這些額外的位元組是不帶正負號的整數。請注意,可變長類型的最大長度、此類型所需的額外位元組數以及佔用相同位元組數的不帶正負號的整數之間的對應關係。例如,MEDIUMBLOB 值可能最多224 - 1位元組長並需要3 個位元組記錄其結果。3 個位元組的整數類型MEDIUMINT 的最大無符號值為224 - 1。這並非偶然。
2.3日期時間列類型
MySQL 提供了幾種時間值的列類型,它們分別是: DATE、DATETIME、TIME、TIMESTAMP和YEAR。下表給出了MySQL 為定義儲存日期和時間值所提供的這些類型,並給出了每種類型的合法取值範圍。
類型名 |
說明 |
DATE |
“YYYY-MM-DD”格式表示的日期值 |
TIME |
“hh:mm:ss”格式表示的時間值 |
DATETIME |
“YYYY-MM-DD hh:mm:ss”格式 |
TIMESTAMP |
“YYYYMMDDhhmmss”格式表示的時間戳記值 |
YEAR |
“YYYY”格式的年份值 |
表6:日期時間列類型
類型名 |
取值範圍 |
儲存需求 |
DATE |
“1000-01-01”到“ArrayArrayArrayArray-12-31” |
3位元組 |
TIME |
“-838:5Array:5Array”到“838:5Array:5Array” |
3位元組 |
DATETIME |
“1000-01-01 00:00:00”到“ArrayArrayArrayArray-12-31 23:5Array:5Array” |
8位元組 |
TIMESTAMP |
1Array700101000000 到2037 年的某個時刻 |
4位元組 |
YEAR |
1Array01 到2155 |
1位元組 |
表7: 日前時間列類型的取值範圍和儲存需求
下面舉個例子:
CREATE TABLE student ( Name varchar(20) NOT NULL, Chinese TINYINT(3), Maths TINYINT(3), English TINYINT(3), Birthday DATE ) |
這個例子建立一個student表,這個表中有name欄位,字元類型列,不允許NULL(空值)。有Chinese、Maths和English三個整數類型列。還有個Birthday日期類型列。