首頁  >  文章  >  資料庫  >  MySQL基礎教學4 — 資料類型之儲存需求及如何選擇正確的類型

MySQL基礎教學4 — 資料類型之儲存需求及如何選擇正確的類型

黄舟
黄舟原創
2017-02-24 11:03:151273瀏覽

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 <= 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 #011#213242##56#789
剩餘的 ##位元組
#位元號 數目
#3
3
4
4
4
日期和時間類型的儲存需求

列類型#DATE3個位元組#DATETIME8個位元組TIMESTAMP4個位元組TIME3個位元組YEAR1個位元組
##儲存需求

#字串類型的儲存需求

#CHAR(VARCHAR(#BINARY(VARBINARY(#TINYBLOB, TINYTEXT#BLOB, TEXT#MEDIUMBLOB, MEDIUMTEXT#LONGBLOB, LONGTEXTENUM('1或2個字節,取決於枚舉值的個數(最多65,535個值)#SET('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位元組長。這說明如果size<= 256,TEXT列的大小為256(其中size表示記錄的大小);否則,大小是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中:

欄位類型 儲存需求
M) M個位元組,0 <= M <= 255
M) L+1個位元組,其中L <= 且0 <= M <= 65535(參見下面的註釋)
M) M個位元組, 0 <= M <= 255
M) #L# +1個位元組,其中L <= 且0 <= M <= 255
L+1個位元組,其中L < 28
L+2個位元組,其中L < 216
L#+3個位元組,其中L < 224
L#+4個位元組,其中L < 232
value1','value2',...)
value1','#value2',... )
##MEDIUMBLOB #LONG VARCHARMEDIUMTEXTLONGMEDIUMTEXT##MIDDLEINTNUMERIC#在建立表格時對列類型進行映射,然後原來的類型定義被丟棄。如果你使用其它賣方的類型來建立一個表,然後執行DESCRIBE 
其它賣方類型 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
MEDIUMINT
DECIMAL
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)!




#

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn