2011-11-22 84 views
3

我想将货币值保存在一个MySQL数据库 - curreny_data表。所以我创建了一个sale_price字段,它是一个双重无符号的。当我要保存负值db时,会生成一个错误并保存默认值零(0)。但是当我要保存减零(-0)时,它可以成功保存。我很困惑。请我需要一些帮助。mysql数据库保存减去零在一个无符号的双字段

回答

3

是不是很明显吗?一个无符号的double(假设存在这种类型)只接受无符号的,即非负的double值。 MySQL足够聪明地知道-0与0相同,所以它可以让你在现场投入-0。 OTOH,负数(根据字段的定义)是不允许的,所以你得到一个错误。 -0 = 0在where子句中,但不是一群人:如果你重新定义字段作为decimal

+1

谢谢Pranav Hosangadi。 – Sara

1
  1. 一般情况下,你应该使用 “十进制” 来存储货币,而不是双:

http://www.stemkoski.com/how-to-properly-store-currencymoney-in-mysql/

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

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

    b)或者您是否仅仅看不到错误异常?

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

+0

是它保存-0成功,减号在那里我看到它。我用其他负值尝试它,然后它会产生一个错误,但不与-0。这就是我困惑的原因。我想使用double,因为我的值包含浮点值。例如4.50 – Sara

+0

我读过你的链接paulsm4谢谢你对我非常有帮助,所以现在我可以在我的货币区域使用小数。 – Sara

1

通常不带符号的双打不存在:请参阅IEEE 754。我建议你使用标准格式(一般来说,金钱也可以有负值)。

我会检查你是否得到一个负值的错误(例如,-1):我认为MySQL认为-0为0并允许它为无符号双精度(尽管-0和0通常有两个不同的表示)

编辑:

的IEE 754标准定义了-0和0应被视为相等(即,0 == -0应持有)

+1

谢谢Matteo。 – Sara

1

注意几个古怪

负值会工作。 和-0通过mysqldump/restore进行0转换(可能会导致slave的问题...)

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