我在MySQL中看到一些与用户创建的函数相关的奇怪行为.我会尽可能简化这一点.
mysql> SELECT 1 / 50
+--------+
| 1/50 |
+--------+
| 0.0200 |
+--------+
1 row in set (0.00 sec)
到现在为止还挺好.现在我创建一个函数来进行这个除法并调用函数:
mysql> delimiter $$
mysql> create function myd(var decimal) returns decimal language sql deterministic
-> begin
-> declare res decimal;
-> set res = var / 50;
->
-> return res;
-> end
-> $$
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;
mysql> select myd(1);
+--------+
| myd(1) |
+--------+
| 0 |
+--------+
1 row in set (0.00 sec)
很奇怪.好吧,让我们尝试一些其他值:
mysql> select myd(10), myd(20), myd(50), myd(70), myd(100);
+---------+---------+---------+---------+----------+
| myd(10) | myd(20) | myd(50) | myd(70) | myd(100) |
+---------+---------+---------+---------+----------+
| 0 | 0 | 1 | 1 | 2 |
+---------+---------+---------+---------+----------+
1 row in set (0.00 sec)
我做了一些测试 – 但是从结果可以清楚地看出函数的结果被舍入为整数值,尽管函数被声明为返回十进制.我尝试用float替换类型decimal,但是没有改变.
那么为什么要进行这种四舍五入,更重要的是,我该如何预防呢?
解决方法:
如果没有为小数指定精度,则默认为DECIMAL(M,0),即逗号后的零位数.
示例:将其定义为
decimal(10,3)
逗号后有3位数字.