根據類別列出了MySQL支持的每一個列類型的存儲需求。mysql
MyISAM表中行的最大大小爲65,534字節。每一個BLOB和TEXT列 帳戶只佔其中的5至9個字節。sql
若是MyISAM表包括變長列類型,記錄格式也是可變長度。當建立表時,在某些條件下,MySQL可 以將一個列從變長類型改成固定長度的類型或反之亦然。數據庫
數值類型存儲需求ide
列類型優化
存儲需求code
TINYINT對象
1個字節ci
SMALLINT字符串
2個字節it
MEDIUMINT
3個字節
INT, INTEGER
4個字節
BIGINT
8個字節
FLOAT(p)
若是0 <= p <= 24爲4個字節, 若是25 <= p <= 53爲8個字節
FLOAT
4個字節
DOUBLE [PRECISION], item REAL
8個字節
DECIMAL(M,D), NUMERIC(M,D)
變長;參見下面的討論
BIT(M)
大約(M+7)/8個 字節
DECIMAL(和NUMERIC)的 存儲需求與具體版本有關:
使用二進制格式將9個十進制(基於10)數壓縮爲4個 字節來表示DECIMAL列值。每一個值的整數和分數部分的存儲分別肯定。每一個9位數的倍數須要4個 字節,而且「剩餘的」位須要4個字節的一部分。下表給出了超出位數的存儲需求:
剩餘的
字節
位數
數目
0
0
1
1
2
1
3
2
4
2
5
3
6
3
7
4
8
4
9
4
日期和時間類型的存儲需求
列類型
存儲需求
DATE
3個字節
DATETIME
8個字節
TIMESTAMP
4個字節
TIME
3個字節
YEAR
1個字節
字符串類型的存儲需求
列類型
存儲需求
CHAR(M)
M個字節,0 <= M <= 255
VARCHAR(M)
L+1個 字節,其中L <= M 且0 <= M <= 65535(參 見下面的註釋)
BINARY(M)
M個字節,0 <= M <= 255
VARBINARY(M)
L+1個 字節,其中L <= M 且0 <= M <= 255
TINYBLOB, TINYTEXT
L+1個 字節,其中L < 28
BLOB, TEXT
L+2個 字節,其中L < 216
MEDIUMBLOB, MEDIUMTEXT
L+3個 字節,其中L < 224
LONGBLOB, LONGTEXT
L+4個 字節,其中L < 232
ENUM('value1','value2',...)
1或2個字節,取決於枚舉值的個數(最 多65,535個值)
SET('value1','value2',...)
一、二、三、4或 者8個字節,取決於set成員的數目(最多64個 成員)
VARCHAR、BLOB和TEXT類是變長類型。每一個類 型的存儲需求取決於列值的實際長度(用前面的表中的L表 示),而不是該類型的最大可能的大小。例如,VARCHAR(10)列能夠容納最大長度爲10的 字符串。實際存儲需求是字符串(L)的 長度,加上一個記錄字符串長度的字節。對於字符串'abcd',L是4, 存儲須要5個字節。
對於CHAR、VARCHAR和TEXT類型,前面的表中的值L和M應 解釋爲字符數目,而且列定義中的這些類型的長度表示字符數目。例如,要想保存一個TINYTEXT值須要L字 符+ 1個字節。
要想計算用於保存具體CHAR、VARCHAR或 者TEXT列值的字節數,須要考慮該列使用的字符集。在具體狀況中,當使用Unicode時,必須 記住全部Unicode字符使用相同的字節數。
註釋:VARCHAR列的有效最 大長度爲65,532字符。
NDBCLUSTER引擎只支持固定寬度的列。這說明MySQL簇中的表中的VARCHAR列 的行爲如同類型CHAR(不一樣的是每一個記錄仍然有一個額外字節空間)。 例如,在Cluster表中,聲明爲VARCHAR(100)的列中的每一個記 錄存儲時將佔用101個字節,不管實際存儲的記錄中的字符串的長度爲多少。
BLOB和TEXT類須要 一、二、3或 者4個字節來記錄列值的長度,取決於該類的最大可能的長度。
在NDB Cluster存儲引擎中,TEXT和BLOB列的實 施是不一樣的,其中TEXT列中的每一個記錄由兩個單獨部分組成。一個是固定大小(256字節), 而且實際上保存在原表中。另外一個包括超出256字節的任何數據,保存在隱含的表中。第2個表中的記 錄老是2,000字節長。這說明若是size<= 256,TEXT列的大小爲256(其中size表 示記錄的大小);不然,大小是256 +size+(2000–(size–256)%2000)。
ENUM對象的大小由不一樣的枚舉值的數目肯定。枚舉用一個字節,能夠有255個可能的 值。當枚舉的值位於256和65,535之間時,用兩個字節。
SET對象的大小由不一樣的set成員的數量肯定。若是set大小 是N,對象佔(N+7)/8個字 節,四捨五入到一、二、三、4或者8個 字節。SET最多能夠有64個成員。
選擇正確的列類型
爲了優化存儲,在任何狀況下均應使用最精確的類型。例如,若是列的值的範圍爲從1到99999, 若使用整數,則MEDIUMINT UNSIGNED是好的類型。在全部能夠表示該列值的類型中,該類型使用的存儲最 少。
用精度爲65位十進制數(基於10)對DECIMAL 列進行全部基本計算(+、-、*、/)。
使用雙精度操做對DECIMAL值進行計算。若是準確度不是過重要或若是速度爲最高優先級,DOUBLE類 型即足夠了。爲了達到高精度,能夠轉換到保存在BIGINT中的定點類型。這樣能夠用64位整數進 行全部計算,根據須要將結果轉換回浮點值。
使用來自其餘數據庫引擎的列類型
爲了使用由其它賣方編寫的SQL執行代碼,MySQL按照下表所示對列類型進行映射。經過這 些映射,能夠很容易地從其它數據庫引擎將表定義導入到MySQL中:
其它賣方類型
MySQL類型
BOOL,
TINYINT
BOOLEAN
TINYINT
CHAR VARYING(M)
VARCHAR(M)
DEC
DECIMAL
FIXED
DECIMAL
FLOAT4
FLOAT
FLOAT8
DOUBLE
INT1
TINYINT
INT2
SMALLINT
INT3
MEDIUMINT
INT4
INT
INT8
BIGINT
LONG VARBINARY
MEDIUMBLOB
LONG VARCHAR
MEDIUMTEXT
LONG
MEDIUMTEXT
MIDDLEINT
MEDIUMINT
NUMERIC
DECIMAL
在建立表時對列類型進行映射,而後原來的類型定義被丟棄。若是你使用其它賣方的類型建立一個表,而後執行DESCRIBE tbl_name語 句,MySQL使用等效的MySQL類型來報告表的結構。例如:
mysql> CREATE TABLE t (a BOOL, b FLOAT8, c LONG, d NUMERIC);
Query OK, 0 rows affected (0.08 sec)
mysql> DESCRIBE t;
+-------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------------+------+-----+---------+-------+
| a | tinyint(1) | YES | | NULL | |
| b | double | YES | | NULL | |
| c | mediumtext | YES | | NULL | |
| d | decimal(10,0) | YES | | NULL | |
+-------+---------------+------+-----+---------+-------+
4 rows in set (0.00 sec)