- MySQL 8從入門到精通(視頻教學(xué)版)
- 王英英
- 1278字
- 2019-11-22 18:25:53
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只能存儲純文本文件。
- 軟件安全技術(shù)
- 高手是如何做產(chǎn)品設(shè)計的(全2冊)
- Oracle Database In-Memory(架構(gòu)與實踐)
- Python編程完全入門教程
- C程序設(shè)計案例教程
- GameMaker Programming By Example
- Spring Boot進階:原理、實戰(zhàn)與面試題分析
- Swift Playgrounds少兒趣編程
- Learning Concurrency in Kotlin
- 持續(xù)輕量級Java EE開發(fā):編寫可測試的代碼
- C++ Fundamentals
- 零基礎(chǔ)輕松學(xué)C++:青少年趣味編程(全彩版)
- Practical Predictive Analytics
- Learning NHibernate 4
- AngularJS Web Application Development Cookbook