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

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

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

1.整數(shù)和浮點數(shù)

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

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

2.浮點數(shù)和定點數(shù)

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

3.日期與時間類型

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

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

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

4.CHAR與VARCHAR之間的特點與選擇

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

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

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

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

存儲引擎對于選擇CHAR和VARCHAR的影響:

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

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

5.ENUM和SET

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

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

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

6.BLOB和TEXT

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

主站蜘蛛池模板: 娱乐| 湖南省| 勐海县| 易门县| 越西县| 西贡区| 法库县| 琼结县| 西昌市| 梁山县| 杨浦区| 甘泉县| 邯郸市| 南宁市| 苍山县| 安达市| 平泉县| 香港 | 南陵县| 峨边| 深水埗区| 兴隆县| 华宁县| 南昌市| 林口县| 公主岭市| 汉沽区| 友谊县| 长治市| 申扎县| 孝义市| 绵阳市| 江油市| 萨嘎县| 乌鲁木齐市| 孟村| 利川市| 疏附县| 武宁县| 隆化县| 沐川县|