MySQL基礎(chǔ)教程4 —— 數(shù)據(jù)類型之存儲(chǔ)需求及如何選擇正確的類型
根據(jù)類別列出了MySQL支持的每個(gè)列類型的存儲(chǔ)需求。
MyISAM表中行的最大大小為65,534字節(jié)。每個(gè)BLOB和TEXT列 賬戶只占其中的5至9個(gè)字節(jié)。
如果MyISAM表包括變長列類型,記錄格式也是可變長度。當(dāng)創(chuàng)建表時(shí),在某些條件下,MySQL可以將一個(gè)列從變長類型改為固定長度的類型或反之亦然。
數(shù)值類型存儲(chǔ)需求
列類型存儲(chǔ)需求TINYINT1個(gè)字節(jié)SMALLINT2個(gè)字節(jié)MEDIUMINT3個(gè)字節(jié)INT,INTEGER4個(gè)字節(jié)BIGINT8個(gè)字節(jié)FLOAT(p)如果0 <=p<= 24為4個(gè)字節(jié),如果25 <=p<= 53為8個(gè)字節(jié)FLOAT4個(gè)字節(jié)DOUBLE [PRECISION], itemREAL8個(gè)字節(jié)DECIMAL(M,D),NUMERIC(M,D)變長;參見下面的討論BIT(M)大約(M+7)/8個(gè)字節(jié)DECIMAL(和NUMERIC)的存儲(chǔ)需求與具體版本有關(guān):
使用二進(jìn)制格式將9個(gè)十進(jìn)制(基于10)數(shù)壓縮為4個(gè)字節(jié)來表示DECIMAL列值。每個(gè)值的整數(shù)和分?jǐn)?shù)部分的存儲(chǔ)分別確定。每個(gè)9位數(shù)的倍數(shù)需要4個(gè)字節(jié),并且“剩余的”位需要4個(gè)字節(jié)的一部分。下表給出了超出位數(shù)的存儲(chǔ)需求:
剩余的字節(jié)位數(shù)數(shù)目00112132425363748494日期和時(shí)間類型的存儲(chǔ)需求
列類型存儲(chǔ)需求DATE3個(gè)字節(jié)DATETIME8個(gè)字節(jié)TIMESTAMP4個(gè)字節(jié)TIME3個(gè)字節(jié)YEAR1個(gè)字節(jié)字符串類型的存儲(chǔ)需求
列類型存儲(chǔ)需求CHAR(M)M個(gè)字節(jié),0<=M<=255VARCHAR(M)L+1個(gè)字節(jié),其中L<=M且0<=M<=65535(參見下面的注釋)BINARY(M)M個(gè)字節(jié),0<=M<=255VARBINARY(M)L+1個(gè)字節(jié),其中L<=M且0<=M<=255TINYBLOB,TINYTEXTL+1個(gè)字節(jié),其中L< 28BLOB,TEXTL+2個(gè)字節(jié),其中L< 216MEDIUMBLOB,MEDIUMTEXTL+3個(gè)字節(jié),其中L< 224LONGBLOB,LONGTEXTL+4個(gè)字節(jié),其中L< 232ENUM(’value1’,’value2’,...)1或2個(gè)字節(jié),取決于枚舉值的個(gè)數(shù)(最多65,535個(gè)值)SET(’value1’,’value2’,...)1、2、3、4或者8個(gè)字節(jié),取決于set成員的數(shù)目(最多64個(gè)成員)VARCHAR、BLOB和TEXT類是變長類型。每個(gè)類型的存儲(chǔ)需求取決于列值的實(shí)際長度(用前面的表中的L表示),而不是該類型的最大可能的大小。例如,VARCHAR(10)列可以容納最大長度為10的字符串。實(shí)際存儲(chǔ)需求是字符串(L)的長度,加上一個(gè)記錄字符串長度的字節(jié)。對于字符串’abcd’,L是4,存儲(chǔ)需要5個(gè)字節(jié)。
對于CHAR、VARCHAR和TEXT類型,前面的表中的值L和M應(yīng)解釋為字符數(shù)目,并且列定義中的這些類型的長度表示字符數(shù)目。例如,要想保存一個(gè)TINYTEXT值需要L字符+ 1個(gè)字節(jié)。
要想計(jì)算用于保存具體CHAR、VARCHAR或者TEXT列值的字節(jié)數(shù),需要考慮該列使用的字符集。在具體情況中,當(dāng)使用Unicode時(shí),必須記住所有Unicode字符使用相同的字節(jié)數(shù)。
注釋:VARCHAR列的有效最大長度為65,532字符。
NDBCLUSTER引擎只支持固定寬度的列。這說明MySQL簇中的表中的VARCHAR列的行為如同類型CHAR(不同的是每個(gè)記錄仍然有一個(gè)額外字節(jié)空間)。例如,在Cluster表中,聲明為VARCHAR(100)的列中的每個(gè)記錄存儲(chǔ)時(shí)將占用101個(gè)字節(jié),無論實(shí)際存儲(chǔ)的記錄中的字符串的長度為多少。
BLOB和TEXT類需要1、2、3或者4個(gè)字節(jié)來記錄列值的長度,取決于該類的最大可能的長度。
在NDB Cluster存儲(chǔ)引擎中,TEXT和BLOB列的實(shí)施是不同的,其中TEXT列中的每個(gè)記錄由兩個(gè)單獨(dú)部分組成。一個(gè)是固定大小(256字節(jié)),并且實(shí)際上保存在原表中。另一個(gè)包括超出256字節(jié)的任何數(shù)據(jù),保存在隱含的表中。第2個(gè)表中的記錄總是2,000字節(jié)長。這說明如果size<= 256,TEXT列的大小為256(其中size表示記錄的大小);否則,大小是256 +size+(2000–(size–256)%2000)。
ENUM對象的大小由不同的枚舉值的數(shù)目確定。枚舉用一個(gè)字節(jié),可以有255個(gè)可能的值。當(dāng)枚舉的值位于256和65,535之間時(shí),用兩個(gè)字節(jié)。
SET對象的大小由不同的set成員的數(shù)量確定。如果set大小是N,對象占(N+7)/8個(gè)字節(jié),四舍五入到1、2、3、4或者8個(gè)字節(jié)。SET最多可以有64個(gè)成員。
2.選擇正確的數(shù)據(jù)類型為了優(yōu)化存儲(chǔ),在任何情況下均應(yīng)使用最精確的類型。例如,如果列的值的范圍為從1到99999,若使用整數(shù),則MEDIUMINT UNSIGNED是好的類型。在所有可以表示該列值的類型中,該類型使用的存儲(chǔ)最少。
用精度為65位十進(jìn)制數(shù)(基于10)對DECIMAL列進(jìn)行所有基本計(jì)算(+、-、*、/)。
使用雙精度操作對DECIMAL值進(jìn)行計(jì)算。如果準(zhǔn)確度不是太重要或如果速度為最高優(yōu)先級,DOUBLE類型即足夠了。為了達(dá)到高精度,可以轉(zhuǎn)換到保存在BIGINT中的定點(diǎn)類型。這樣可以用64位整數(shù)進(jìn)行所有計(jì)算,根據(jù)需要將結(jié)果轉(zhuǎn)換回浮點(diǎn)值。
3.使用來自其他數(shù)據(jù)庫引擎的列類型為了使用由其它賣方編寫的SQL執(zhí)行代碼,MySQL按照下表所示對列類型進(jìn)行映射。通過這些映射,可以很容易地從其它數(shù)據(jù)庫引擎將表定義導(dǎo)入到MySQL中:
其它賣方類型MySQL類型BOOL,TINYINTBOOLEANTINYINTCHAR VARYING(M)VARCHAR(M)DECDECIMALFIXEDDECIMALFLOAT4FLOATFLOAT8DOUBLEINT1TINYINTINT2SMALLINTINT3MEDIUMINTINT4INTINT8BIGINTLONG VARBINARYMEDIUMBLOBLONG VARCHARMEDIUMTEXTLONGMEDIUMTEXTMIDDLEINTMEDIUMINTNUMERICDECIMAL在創(chuàng)建表時(shí)對列類型進(jìn)行映射,然后原來的類型定義被丟棄。如果你使用其它賣方的類型創(chuàng)建一個(gè)表,然后執(zhí)行DESCRIBEtbl_name語句,MySQL使用等效的MySQL類型來報(bào)告表的結(jié)構(gòu)。例如:
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)
相關(guān)文章:
1. 解決從集合運(yùn)算到mysql的not like找不出NULL的問題2. SQL SERVER學(xué)習(xí),太復(fù)雜了!3. Oracle內(nèi)部工具Block Corruption介紹4. MySql如何使用not in實(shí)現(xiàn)優(yōu)化5. MYSQL SQL查詢近7天一個(gè)月的數(shù)據(jù)的操作方法6. MySQL Group by的優(yōu)化詳解7. Oracle中的高效SQL編寫PARALLEL解析8. Oracle監(jiān)控?cái)?shù)據(jù)庫性能的SQL匯總9. SQL Server中, DateTime (日期)型操作10. 輕松掌握Oracle數(shù)據(jù)庫Where條件執(zhí)行順序
