我想在mysql db - curreny_data表中保存货币值。所以我创建了一个sale_price字段,这是一个 double unsigned 。当我要保存减去值时,db生成错误并保存默认值零(0)。但是当我要保存减零(-0)时,它会成功保存。我很迷惑。我需要一些帮助。
答案 0 :(得分:3)
不是很明显吗?无符号双精度(假设存在这种类型)仅采用无符号,即非负双精度值。 MySQL很聪明,知道-0与0相同,所以它允许你把-0放在字段中。 OTOH,负数(根据字段的定义)是不允许的,因此您会收到错误。
如果您将字段重新定义为decimal
类型
答案 1 :(得分:1)
http://www.stemkoski.com/how-to-properly-store-currencymoney-in-mysql/
我很好奇为什么你相信-0“成功保存”:
a)你能看到双值中的符号位吗?
b)或者您是否未能看到错误异常?
无论哪种方式 - 有什么区别?为了数钱,零不总是零?
答案 2 :(得分:1)
通常,无符号双打不存在:请参阅IEEE 754。我建议你使用标准格式(一般来说钱也可以有负值)。
我会检查你是否得到一个负值的错误(例如,-1):我认为MySQL认为-0为0并允许它为无符号双精度(尽管-0和0通常有两个不同的表示)
编辑:
IEE 754标准定义-0和0应该被认为是相等的(即0 == -0应该保持)
答案 3 :(得分:1)
注意一些奇怪之处: -0 = 0在where子句中但不是group by。 和-0通过mysqldump / restore转换为0(可能导致从属问题......)
create table testnegzero ( n double);
insert into testnegzero values (0.001), (-0.001);
update testnegzero set n = round(n);
select * from testnegzero ;
+------+
| n |
+------+
| 0 |
| -0 |
+------+
(你也可以通过一些计算得出-0)
select count(*) from testnegzero where n=0;
+----------+
| count(*) |
+----------+
| 2 |
+----------+
select count(*) from testnegzero group by n;
+----------+
| count(*) |
+----------+
| 1 |
| 1 |
+----------+
我发现自己试图清除这些,这并不容易,因为你无法搜索“COL = -0” 最终我这样做了:
识别受影响的列:
select * from testnegzero where cast(n as char(20))="-0";
+------+
| n |
+------+
| -0 |
+------+
清除它们:
update testnegzero set n=0 where cast(n as char(20))="-0";
select * from testnegzero ;
+------+
| n |
+------+
| 0 |
| 0 |
+------+