2011-11-22 83 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 | 
+------+