- MySQL 8從零開始學(xué)(視頻教學(xué)版)
- 胡同夫
- 1280字
- 2020-03-06 11:33:27
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只能存儲純文本文件。
- Embedded Linux Projects Using Yocto Project Cookbook
- SPSS數(shù)據(jù)挖掘與案例分析應(yīng)用實(shí)踐
- Node.js 10實(shí)戰(zhàn)
- Python語言程序設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)(Java語言描述)
- Designing Hyper-V Solutions
- 算法精粹:經(jīng)典計(jì)算機(jī)科學(xué)問題的Python實(shí)現(xiàn)
- 數(shù)據(jù)結(jié)構(gòu)習(xí)題精解(C語言實(shí)現(xiàn)+微課視頻)
- Instant Ext.NET Application Development
- 深度學(xué)習(xí):Java語言實(shí)現(xiàn)
- HTML5+CSS3 Web前端開發(fā)技術(shù)(第2版)
- 動手學(xué)數(shù)據(jù)結(jié)構(gòu)與算法
- Hands-On Kubernetes on Windows
- 深入淺出Python數(shù)據(jù)分析
- Learning Gerrit Code Review