mysql資料類型儲存需求及如何選擇正確的類型

伊谢尔伦
發布: 2016-11-23 13:10:35
原創
1437 人瀏覽過

1. 列類型儲存需求

根據類別列出了MySQL支援的每個欄位類型的儲存需求。

MyISAM表中行的最大大小為65,534位元組。每個BLOB和TEXT列 帳戶只佔其中的5至9個位元組。

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

數值型別儲存需求

欄位類型   儲存需求   

TINYINT    1個位元組   

ME, INT, INTEGER    4個位元組   

BIGINT    8個位元組   

FLOAT(p)    如果0

FLOAT    4個字節   

DOUBLE [PRECISION], item REAL    8個位元組   

DECIMAL(M,D), NUMERIC(M,D)    變長;請參閱下列的討論   

BIT(M)    約(M+7)/8個位元組和D起需求與特定版本有關:

使用二進位格式將9個十進位(基於10)數壓縮為4個位元組來表示DECIMAL列值。每個值的整數和分數部分的儲存分別確定。每個9位數的倍數需要4個位元組,而「剩餘的」位元需要4個位元組的一部分。下表給了超過位數的儲存需求:

剩餘的   位元組   

位數   數目   

0    0   🠎

3    2    

4    2    

5    3    

6 3    

7    4    

8    4    

9    4       3個位元組   

DATETIME    8個位元組   

TIMESTAMP    4個位元組   

TIME    3個位元組   

YEAR    1個位元組   

字串類型的儲存需求

欄位類型      

VARCHAR(M )    L+1個位元組,其中L 

BINARY(M)    M個位元組, )    L+1個位元組,其中L 

TINYBLOB, TINYTEXT    L+1個位元組,其中L ,其中L 

MEDIUMBLOB, MEDIUMTEXT    L+3個位元組,其中L 

LONGBLOB, LONGTEXT    

LONGBLOB ue1','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類型,前面的表格中的值L和M應解釋為字元數目,並且列定義中的這些類型的長度表示字元數目。例如,要想儲存一個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

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    

RCHAR(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)
登入後複製



相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!