MySQL中Decimal類型和Float Double等區別

MySQL中存在float,double等非標準數據類型,
也有decimal這種標準數據類型。
其區別在於,float,double等非標準類型,在DB中保存的是近似值,而Decimal則以字符串的形式保存數值。
數據定義
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   |
+------------+------------+
| 1234567.25 | 1234567.23 |
| 9876543.00 | 9876543.12 |
+------------+------------+
2 rows in set (0.00 sec)
再舉例: DECIMAL(5,3)
1.2345 --- 小數點後最多3位,所以保存可以,自動四捨五入數據截斷。
12.345 --- OK
123.45 --- 因爲小數部分未滿3位,要補0.所以保存應該123.450。所以整個位數超出了5,保存不可。
1.2 --- 小數未滿部分補0。按照1.200保存。

mysql> CREATE TABLE IF NOT EXISTS `decimal_test`(
-> num DECIMAL(5,3)
-> );
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO `decimal_test`(num)VALUES(1.2345);
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> INSERT INTO `decimal_test`(num)VALUES(12.345);
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO `decimal_test`(num)VALUES(123.45);
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> INSERT INTO `decimal_test`(num) VALUES(1.2);
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM `decimal_test`;
+--------+
| num |
+--------+
| 1.235 |
| 12.345 |
| 99.999 | 沒有正常保存
| 1.200 | 末尾未滿補0
+--------+
4 rows in set (0.00 sec)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章