MySQL基礎教程4 — 數據類型之存儲需求及如何選擇正確的類型

1. 列類型存儲需求

根據類別列出了mysql支持的每個列類型的存儲需求。

MyISAM表中行的最大大小為65,534字節。每個BLOB和TEXT列 賬戶只占其中的5至9個字節。

如果MyISAM表包括變長列類型,記錄格式也是可變長度。當創建表時,在某些條件下,MySQL可以將一個列從變長類型改為固定長度的類型或反之亦然。

數值類型存儲需求

列類型 存儲需求
TINYINT 1個字節
SMALLINT 2個字節
MEDIUMINT 3個字節
INT,?INTEGER 4個字節
BIGINT 8個字節
FLOAT(p) 如果0 p?p?
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?
VARCHAR(M) L+1個字節,其中L?M?且0?M?
BINARY(M) M個字節,0?M?
VARBINARY(M) L+1個字節,其中L?M?且0?M?
TINYBLOB,?TINYTEXT L+1個字節,其中L?8
BLOB,?TEXT L+2個字節,其中L?16
MEDIUMBLOB,?MEDIUMTEXT L+3個字節,其中L?24
LONGBLOB,?LONGTEXT L+4個字節,其中L?32
ENUM(‘value1‘,’value2‘,…) 1或2個字節,取決于枚舉值的個數(最多65,535個值)
SET(‘value1‘,’value2‘,…) 1、2、3、4或者8個字節,取決于set成員的數目(最多64個成員)

VARCHAR、BLOB和TEXT類是變長類型。每個類型的存儲需求取決于列值的實際長度(用前面的表中的L表示),而不是該類型的最大可能的大小。例如,VARCHAR(10)列可以容納最大長度為10的字符串。實際存儲需求是字符串(L)的長度,加上一個記錄字符串長度的字節。對于字符串’abcd’,L是4,存儲需要5個字節。

對于CHAR、VARCHAR和TEXT類型,前面的表中的值LM應解釋為字符數目,并且列定義中的這些類型的長度表示字符數目。例如,要想保存一個TINYTEXT值需要L字符+ 1個字節。

要想計算用于保存具體CHAR、VARCHAR或者TEXT列值的字節數,需要考慮該列使用的字符集。在具體情況中,當使用Unicode時,必須記住所有Unicode字符使用相同的字節數。

注釋:VARCHAR列的有效最大長度為65,532字符。

NDBCLUSTER引擎只支持固定寬度的列。這說明MySQL簇中的表中的VARCHAR列的行為如同類型CHAR(不同的是每個記錄仍然有一個額外字節空間)。例如,在Cluster表中,聲明為VARCHAR(100)的列中的每個記錄存儲時將占用101個字節,無論實際存儲的記錄中的字符串的長度為多少。

BLOB和TEXT類需要?1、2、3或者4個字節來記錄列值的長度,取決于該類的最大可能的長度。

在NDB Cluster存儲引擎中,TEXT和BLOB列的實施是不同的,其中TEXT列中的每個記錄由兩個單獨部分組成。一個是固定大小(256字節),并且實際上保存在原表中。另一個包括超出256字節的任何數據,保存在隱含的表中。第2個表中的記錄總是2,000字節長。這說明如果sizesize表示記錄的大小);否則,大小是256 +size+(2000–(size–256)%2000)。

ENUM對象的大小由不同的枚舉值的數目確定。枚舉用一個字節,可以有255個可能的值。當枚舉的值位于256和65,535之間時,用兩個字節。

SET對象的大小由不同的set成員的數量確定。如果set大小是N,對象占(N+7)/8個字節,四舍五入到1、2、3、4或者8個字節。SET最多可以有64個成員。

2.?選擇正確的數據類型

為了優化存儲,在任何情況下均應使用最精確的類型。例如,如果列的值的范圍為從1到99999,若使用整數,則MEDIUMINT UNSIGNED是好的類型。在所有可以表示該列值的類型中,該類型使用的存儲最少。

用精度為65位十進制數(基于10)對DECIMAL?列進行所有基本計算(+、-、*、/)。

使用雙精度操作對DECIMAL值進行計算。如果準確度不是太重要或如果速度為最高優先級,DOUBLE類型即足夠了。為了達到高精度,可以轉換到保存在BIGINT中的定點類型。這樣可以用64位整數進行所有計算,根據需要將結果轉換回浮點值。

3.?使用來自其他數據庫引擎的列類型

為了使用由其它賣方編寫的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)

?以上就是MySQL基礎教程4 —— 數據類型之存儲需求及如何選擇正確的類型的內容,更多相關內容請關注PHP中文網(www.php.cn)!

? 版權聲明
THE END
喜歡就支持一下吧
點贊15 分享