詳見:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt336
實數是帶有小數部分的數字。然而,它們不只是為了存儲小數部分,也可以使用
DEClMAL 存儲比 BIGINT還大的整數。 MySQL 既支持精確類型,也支持不精確類型。
FLOAT 和 DOUBLE 類型支持使用標准的渾點運算進行近似計算。如果需要知道浮點運算是
怎么計算的,則需要研究所使用的平台的浮點數的具體實現。
DECIMAL 類型用於存儲精確的小數。在 MySQL 5.0 和更高版本, DECIMAL 類型支持精確 計算。 MySQL 4.1 以及更早版本則使用浮點運算來實現 DECIAML 的計算,這樣做會因為 精度損失導致一些奇怪的結果。在這些版本的 MySQL 中,DEClMAL 只是一個"存儲類型"。
因為 CPU 不支持對 DEClMAL 的直接計算,所以在 MySQL 5.0 以及更高版本中, MySQL 服務器自身實現了 DECIMAL 的高精度計算。相對而言, CPU 直接支持原生浮點計算,所 以浮點運算明顯更快。
浮點和 DECIMAL 類型都可以指定精度。對於 DECIMAL 列,可以指定小數點前后所允許的 最大位數。這會影響列的空間消耗。 MySQL 5.0 和更高版本將數字打包保存到一個二進 制字符串中(每 4個字節存 9個數字)。例如, DEClMAL(18 ,9)小數點兩邊將各存儲 9個 數字,一共使用 9 個字節:小數點前的數字用 4 個字節,小數點后的數字用 4 個字節, 小數點本身占 1個字節。
MySQL 5.0 和更高版本中的 DEClMAL 類型允許最多 65個數字。而早期的 MySQL 版本中 這個限制是254個數字,並且保存為未壓縮的字符串(每個數字一個字節)。然而,這些(早 期)版本實際上並不能在計算中使用這么大的數字,因為 DECIMAL 只是一種存儲格式: 在計算中 DEClMAL 會轉換為 DOUBLE 類型。
有多種方法可以指定浮點列所需要的精度,這會使得 MySQL 悄悄選擇不同的數據類型, 或者在存儲時對值進行取舍。這些精度定義是非標准的,所以我們建議只指定數據類型, 不指定精度。
浮點類型在存儲同樣范圍的值時,通常比 DECIMAL 使用更少的空間。 FLOAT 使用 4個字 節存儲。 DOUBLE 占用8個字節,相比 FLOAT有更高的精度和更大的范圍。和整數類型一樣, 能選擇的只是存儲類型 IMySQL 使用 DOUBLE 作為內部浮點計算的類型。
因為需要額外的空間和計算開銷,所以應該盡量只在對小數進行精確計算時才使用
DECIMAL一一例如存儲財務數據。但在數據量比較大的時候,可以考慮使用 BIGINT 代替
DECIMAL,將需要存儲的貨幣單位根據小數的位數乘以相應的倍數即可。假設要存儲財
務數據精確到萬分之一分,則可以把所有金額乘以一百萬,然后將結果存儲在 BIGI町里,
這樣可以同時避免浮點存儲計算不精確和 DECIMAL 精確計算代價高的問題。