MySQL中存在float,double等非标准数据类型,也有decimal这种标准数据类型。

其区别在于,float,double等非标准类型,在DB中保存的是近似值,而Decimal则以字符串的形式保存数值。

对于精度比较高的东西,比如money,我会用decimal类型,不会考虑float,double,因为他们容易产生误差,numeric和decimal同义,numeric将自动转成decimal。

DECIMAL从MySQL 5.1引入,列的声明语法是DECIMAL(M,D)。在MySQL 5.1中,参量的取值范围如下:

·M是数字的最大数(精度)。其范围为1~65(在较旧的MySQL版本中,允许的范围是1~254),M 的默认值是10。

·D是小数点右侧数字的数目(标度)。其范围是0~30,但不得超过M。

举例:DECIMAL(5,3)

1.2345 — 小数点后最多3位,所以保存可以,自动四舍五入数据截断。

12.345 — OK

123.45 — 因为小数部分未满3位,要补0.所以保存应该123.450。所以整个位数超出了5,保存不可。

1.2 — 小数未满部分补0。按照1.200保存。

-> 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)