官术网_书友最值得收藏!

3.2 如何選擇數(shù)據(jù)類型

MySQL提供了大量的數(shù)據(jù)類型,為了優(yōu)化存儲、提高數(shù)據(jù)庫性能,在任何情況下均應(yīng)使用最精確的類型,即在所有可以表示該列值的類型中,該類型使用的存儲最少。

1. 整數(shù)和浮點(diǎn)數(shù)

如果不需要小數(shù)部分,就使用整數(shù)來保存數(shù)據(jù);如果需要表示小數(shù)部分,就使用浮點(diǎn)數(shù)類型。對于浮點(diǎn)數(shù)據(jù)列,存入的數(shù)值會對該列定義的小數(shù)位進(jìn)行四舍五入。例如,列的值的范圍為1~99999,若使用整數(shù),則MEDIUMINT UNSIGNED是最好的類型;若需要存儲小數(shù),則使用FLOAT類型。

浮點(diǎn)類型包括FLOAT和DOUBLE類型。DOUBLE類型精度比FLOAT類型高,因此,要求存儲精度較高時(shí),應(yīng)選擇DOUBLE類型。

2. 浮點(diǎn)數(shù)和定點(diǎn)數(shù)

浮點(diǎn)數(shù)FLOAT、DOUBLE相對于定點(diǎn)數(shù)DECIMAL的優(yōu)勢是:在長度一定的情況下,浮點(diǎn)數(shù)能表示更大的數(shù)據(jù)范圍。但是由于浮點(diǎn)數(shù)容易產(chǎn)生誤差,因此對精確度的要求比較高時(shí),建議使用DECIMAL來存儲。DECIMAL在MySQL中是以字符串存儲的,用于定義貨幣等對精確度要求較高的數(shù)據(jù)。在數(shù)據(jù)遷移中,float(M,D)是非標(biāo)準(zhǔn)SQL定義,數(shù)據(jù)庫遷移可能會出現(xiàn)問題,最好不要這樣使用。另外,兩個(gè)浮點(diǎn)數(shù)進(jìn)行減法和比較運(yùn)算時(shí)容易出問題,因此在進(jìn)行計(jì)算的時(shí)候一定要小心。如果進(jìn)行數(shù)值比較,那么最好使用DECIMAL類型。

3. 日期與時(shí)間類型

MySQL對于不同種類的日期和時(shí)間有很多的數(shù)據(jù)類型,比如YEAR和TIME。若只需要記錄年份,則使用YEAR類型即可;若只記錄時(shí)間,則只需使用TIME類型。

若同時(shí)需要記錄日期和時(shí)間,則可以使用TIMESTAMP或者DATETIME類型。由于TIMESTAMP列的取值范圍小于DATETIME的取值范圍,因此存儲范圍較大的日期最好使用DATETIME。

TIMESTAMP有一個(gè)DATETIME不具備的屬性。默認(rèn)情況下,當(dāng)插入一條記錄,但并沒有指定TIMESTAMP這個(gè)列值時(shí),MySQL會把TIMESTAMP列設(shè)為當(dāng)前的時(shí)間。因此,當(dāng)需要插入記錄,同時(shí)插入當(dāng)前時(shí)間時(shí),使用TIMESTAMP是方便的,另外TIMESTAMP在空間上比DATETIME更有效。

4. CHAR與VARCHAR之間的特點(diǎn)與選擇

CHAR和VARCHAR的區(qū)別如下:

? CHAR是固定長度字符,VARCHAR是可變長度字符。

? CHAR會自動刪除插入數(shù)據(jù)的尾部空格,VARCHAR不會刪除尾部空格。

CHAR是固定長度,所以它的處理速度比VARCHAR的速度要快,但是它的缺點(diǎn)是浪費(fèi)存儲空間。所以對存儲不大,但在速度上有要求的可以使用CHAR類型,反之可以使用VARCHAR類型來實(shí)現(xiàn)。

存儲引擎對于選擇CHAR和VARCHAR的影響如下。

? 對于MyISAM存儲引擎,最好使用固定長度的數(shù)據(jù)列代替可變長度的數(shù)據(jù)列。這樣可以使整個(gè)表靜態(tài)化,從而使數(shù)據(jù)檢索更快,用空間換時(shí)間。

? 對于InnoDB存儲引擎,使用可變長度的數(shù)據(jù)列,因?yàn)镮nnoDB數(shù)據(jù)表的存儲格式不分固定長度和可變長度,因此使用CHAR不一定比使用VARCHAR更好,但由于VARCHAR是按照實(shí)際的長度存儲的,比較節(jié)省空間,因此對磁盤I/O和數(shù)據(jù)存儲總量比較好。

5. ENUM和SET

ENUM只能取單個(gè)值,它的數(shù)據(jù)列表是一個(gè)枚舉集合。它的合法取值列表最多允許有65 535個(gè)成員。因此,在需要從多個(gè)值中選取一個(gè)時(shí),可以使用ENUM。比如,性別字段適合定義為ENUM類型,每次只能從‘男’或‘女’中取一個(gè)值。

SET可取多個(gè)值。它的合法取值列表最多允許有64個(gè)成員。空字符串也是一個(gè)合法的SET值。在需要取多個(gè)值的時(shí)候,適合使用SET類型,比如,要存儲一個(gè)人的興趣愛好,最好使用SET類型。

ENUM和SET的值是以字符串形式出現(xiàn)的,但在內(nèi)部,MySQL以數(shù)值的形式存儲它們。

6. BLOB和TEXT

BLOB是二進(jìn)制字符串,TEXT是非二進(jìn)制字符串,兩者均可存放大容量的信息。BLOB主要存儲圖片、音頻信息等,而TEXT只能存儲純文本文件。

主站蜘蛛池模板: 上饶市| 临泽县| 星座| 望奎县| 潮安县| 英超| 永胜县| 宁武县| 文安县| 永清县| 安岳县| 钟山县| 安龙县| 巴南区| 虞城县| 武穴市| 忻州市| 临泽县| 沂源县| 曲沃县| 武隆县| 奉化市| 石林| 融水| 攀枝花市| 昌吉市| 阳东县| 陈巴尔虎旗| 康乐县| 长岛县| 湘乡市| 观塘区| 繁昌县| 临湘市| 新民市| 遂宁市| 都安| 肥西县| 冷水江市| 尚志市| 新余市|