MySQL中 DECIMAL FLOAT DOUBLE的區別 MySQL中Decimal類型和Float Double等區別 mysql數據類型double和decimal區別詳解

第一篇文章:html

MySQL中Decimal類型和Float Double等區別 

MySQL中存在float,double等非標準數據類型,也有decimal這種標準數據類型。
其區別在於,float,double等非標準類型,在DB中保存的是近似值,而Decimal則以字符串的形式保存數值。
float,double類型是能夠存浮點數(即小數類型),可是float有個壞處,當你給定的數據是整數的時候,那麼它就以整數給你處理。這樣咱們在存取貨幣值的時候天然遇到問題,個人default值爲:0.00而實際存儲是0,一樣我存取貨幣爲12.00,實際存儲是12。
幸虧mysql提供了兩個數據類型:decimal,這種數據類型能夠輕鬆解決上面的問題:decimal類型被 MySQL 以一樣的類型實現,這在 SQL92 標準中是容許的。他們用於保存對準確精度有重要要求的值,例如與金錢有關的數據。

數據定義
float(M,S) M爲全長,S爲小數點後長度。對於不精準的例子,網絡上不少,Copy以下:
mysql> create table t1(c1 float(10,2), c3decimal(10,2)); 
Query OK, 0 rows affected (0.02 sec)
mysql> insert into t1 values(9876543.21, 9876543.12);                   
Query OK, 1 row affected (0.00 sec)
mysql> select * from t1;                        
+----------------+-----------------+
| c1                | c3                   |
+----------------+-----------------+
| 9876543.00 | 9876543.12 | 
+----------------+------------------+
2 rows in set (0.00 sec)

再舉例: DECIMAL(5,2)

mysql> create table t1(id1 float(5,2) default null,id2 double(5,2) default null,
id3 decimal(5,2) default null );mysql

mysql> insert into t1 values(1.2345,1.2345,1.2345);
Query OK, 1 row affected, 1 warning (0.04 sec)git

mysql> show warnings;
+-------+------+------------------------------------------+
| Level | Code | Message |
+-------+------+------------------------------------------+
| Note | 1265 | Data truncated for column 'id3' at row 1 |
+-------+------+------------------------------------------+
1 row in set (0.00 sec)sql

 
1.2345 --- 小數點後最多2位,因此保存能夠,自動四捨五入數據截斷,但會報waning,但float和double就不會報警告
12.34 --- OK
1234.5 --- 由於小數部分未滿2位,要補0.因此保存應該1234.50。因此整個位數超出了5,將會存儲爲999.99。
1.2 --- 小數未滿部分補0。按照1.20保存。
 
默認狀態比較
浮點數若是不寫精度和標度,會按照實際精度值保存,若是有精度和標度,則會自動將四捨五入後的結果插入,系統不會報錯;定點數若是不寫精度和標度,則按照默認值decimal(10,0) 來操做,若是數據超過了精度和標度值,系統會報錯。



第二篇文章

mysql數據類型double和decimal區別詳解

實數是帶有小數部分的數字。然而,它們不僅是爲了存儲小數部分,也可使用DEClMAL 存儲比 BIGINT還大的整數。 MySQL 既支持精確類型,也支持不精確類型。FLOAT 和  DOUBLE 類型支持使用標準的浮點運算進行近似計算。若是須要知道浮點運算是怎麼計算的,則須要研究所使用的平臺的浮點數的具體實現。 服務器

DECIMAL 類型用於存儲精確的小數。在 MySQL 5.0 和更高版本, DECIMAL 類型支持精確 計算。 MySQL 4.1 以及更早版本則使用浮點運算來實現 DECIAML 的計算,這樣作會由於 精度損失致使一些奇怪的結果。在這些版本的MySQL 中,DEClMAL 只是一個"存儲類型"。網絡

由於 CPU 不支持對 DEClMAL 的直接計算,因此在 MySQL 5.0 以及更高版本中, MySQL 服務器自身實現了 DECIMAL 的高精度計算。相對而言, CPU 直接支持原生浮點計算,所 以浮點運算明顯更快。post

浮點和 DECIMAL 類型均可以指定精度。對於 DECIMAL 列,能夠指定小數點先後所容許的 最大位數。這會影響列的空間消耗。 MySQL 5.0 和更高版本在內部把定點數保存爲二進制格式:先把定點數分紅小數點前面和小數點後面兩部分,併爲它們各自分配4個字節,這4個字節最多能夠表示9個數字(nine digits)。也就是說,DECIMAL(6,3)和 DECIMAL(18,9)都將佔用9個字節(小數點自己佔一個字節)。若是還有多出來的數字,存儲須要的字節以下:ui

Leftover Digits Number of Bytes
0 0
1–2 1
3–4 2
5–6 3
7–9 4

MySQL 5.0 和更高版本中的 DEClMAL 類型容許最多 65個數字。而早期的 MySQL 版本中 這個限制是254個數字,而且保存爲未壓縮的字符串(每一個數字一個字節)。然而,這些(早 期)版本實際上並不能在計算中使用這麼大的數字,由於 DECIMAL 只是一種存儲格式: 在計算中 DEClMAL 會轉換爲 DOUBLE 類型。url

有多種方法能夠指定浮點列所須要的精度,這會使得   MySQL 悄悄選擇不一樣的數據類型, 或者在存儲時對值進行取捨。這些精度定義是非標準的,因此咱們建議只指定數據類型, 不指定精度。spa

浮點類型在存儲一樣範圍的值時,一般比 DECIMAL 使用更少的空間。 FLOAT 使用 4個字 節存儲。 DOUBLE 佔用8個字節,相比 FLOAT有更高的精度和更大的範圍。和整數類型同樣, 能選擇的只是存儲類型 IMySQL 使用 DOUBLE 做爲內部浮點計算的類型。

由於須要額外的空間和計算開銷,因此應該儘可能只在對小數進行精確計算時才使用DECIMAL一一例如存儲財務數據。但在數據量比較大的時候,能夠考慮使用     BIGINT 代替DECIMAL,將須要存儲的貨幣單位根據小數的位數乘以相應的倍數便可。假設要存儲財務數據精確到萬分之一分,則能夠把全部金額乘以一百萬,而後將結果存儲在  BIGINT裏,這樣能夠同時避免浮點存儲計算不精確和 DECIMAL 精確計算代價高的問題。





第三篇文章,官方文檔 

https://dev.mysql.com/doc/refman/5.7/en/precision-math-decimal-characteristics.html

相關文章
相關標籤/搜索