mysql数据库在无符号双字段中保存减零

时间:2011-11-22 06:17:23

标签: mysql

我想在mysql db - curreny_data表中保存货币值。所以我创建了一个sale_price字段,这是一个 double unsigned 。当我要保存减去值时,db生成错误并保存默认值零(0)。但是当我要保存减零(-0)时,它会成功保存。我很迷惑。我需要一些帮助。

4 个答案:

答案 0 :(得分:3)

不是很明显吗?无符号双精度(假设存在这种类型)仅采用无符号,即非负双精度值。 MySQL很聪明,知道-0与0相同,所以它允许你把-0放在字段中。 OTOH,负数(根据字段的定义)是不允许的,因此您会收到错误。

如果您将字段重新定义为decimal类型

,则负值将起作用

答案 1 :(得分:1)

  1. 一般情况下,您应该使用“十进制”来存储货币,而不是双倍:
  2. http://www.stemkoski.com/how-to-properly-store-currencymoney-in-mysql/

    1. 我很好奇为什么你相信-0“成功保存”:

      a)你能看到双值中的符号位吗?

      b)或者您是否未能看到错误异常?

    2. 无论哪种方式 - 有什么区别?为了数钱,零不总是零?

答案 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 |
+------+