1. 程式人生 > >8.2 第八章 選擇合適的資料型別

8.2 第八章 選擇合適的資料型別

8.3 浮點數與定點數

對於小數的表示,MySQL 分為兩種方式:浮點數和定點數。浮點數包括 float(單精度)和 double(雙精度),而定點數則只有 decimal 一種表示。定點數在 MySQL 內部以字串形式存放,比浮點數更精確,適合用來表示貨幣等精度高的資料。

浮點數和定點數都可以用型別名稱後加“(M,D)”的方式來進行表示,“(M,D)”表示該值一共顯示 M 位數字(整數位+小數位),其中 D 位位於小數點後面,M D 又稱為精度和標度。例如,定義為 float(7,4)的一個列可以顯示為-999.9999。MySQL 儲存值時進行四捨五入,因此如果在 float(7,4)列內插入 999.00009,近似結果是 999.0001。值得注意的是,浮點數後面跟“(M

,D)”的用法是非標準用法,如果要用於資料庫的遷移,則最好不要這麼使用。float 和 double 在不指定精度時,預設會按照實際的精度(由實際的硬體和作業系統決定)來顯示,而 decimal 在不指定精度時,預設的整數位為 10,預設的小數位為 0。

  • 各種資料型別的範圍

解決方案
1、decimal
  在MySQL中,帶有小數的精確運算可以使用decimal型別

  CREATE TABLE t3 (i INT, d1 decimal(10,3), d2 decimal(10,3));
  +------+---------+-------+
  | i | a | b |
  +------+---------+-------+
  | 6 | -51.400 | 0.000 |
  +------+---------+-------+
限制
  decimal的精確表示為decimal(M,D),其中M最大為65,D最大為30。因此其表示的範圍是遠遠小於double所能表示的範圍

2、基於應用的解決方案
  比如商品價格涉及到小數,用20.95元表示,那麼可以把價格變成以分為單位,即變成2095。

結論
  
不要使用float、double以及其等價型別做精確計算。如果要在MySQL中做精確計算,推薦使用decimal或者將相關計算任務交給應用。
8.4 日期型別選擇
MySQL 提供的常用日期型別有DATE、TIME 、DATETIME、TIMESTAMP,它們之間的區
別在第3 章中已經進行過詳細論述,這裡就不再贅述。下面主要總結一下選擇日期型別的原
則。
  • 根據實際需要選擇能夠滿足應用的最小儲存的日期型別。如果應用只需要記錄“年
份”,那麼用1 個位元組來儲存的YEAR 型別完全可以滿足,而不需要用4 個位元組來 儲存的DATE 型別。這樣不僅僅能節約儲存,更能夠提高表的操作效率。
  • 如果要記錄年月日時分秒,並且記錄的年份比較久遠,那麼最好使用DATETIME,
而不要使用TIMESTAMP。因為TIMESTAMP 表示的日期範圍比DATETIME 要短得多。
  • 如果記錄的日期需要讓不同時區的使用者使用,那麼最好使用TIMESTAMP,因為日
期型別中只有它能夠和實際時區相對應。

8.5 小結

本章中主要介紹了常見資料型別的選擇原則,簡單歸納如下。

 對於字元型別,要根據儲存引擎來進行相應的選擇。
 對精度要求較高的應用中,建議使用定點數來儲存數值,以保證結果的準確性。
 對含有TEXT 和BLOB 欄位的表,如果經常做刪除和修改記錄的操作要定時執行
OPTIMIZE TABLE 功能對錶進行碎片整理。
 日期型別要根據實際需要選擇能夠滿足應用的最小儲存的日期型別。