2010-09-24 23 views
1

我最近得到了一個對我來說有點奇怪的bug。讓我們考慮一下,我們有一個FLOAT列的表(8,3)。我們也考慮一下我們有一個經過驗證的表格編輯器可以通過網頁瀏覽器訪表編輯器支持用於每列中的客戶端驗證,並且不允許把浮子不在使用一個簡單的JavaScript正則表達式由列類型指定的範圍內,例如:MySQL JDBC驅動程序和FLOAT(N,M)列類型

var rx = new RegExp("^\\d{1," + (total - precision) + "}(\\.\\d{1," + precision + "})?$"); 

表示簡單地:

^\d{1,5}(\.\d{1,3})?$ 

for FLOAT(8,3)。用戶可以輕鬆地將99999.999輸入到該單元格中,並且當他保存更改時,他在單元格中獲得100000個 - 對錶格列約束無效的精度丟失值。我試圖擴展驗證器正則表達式來傳遞100000,但是這個值不能將保存到數據庫中。哇...由於「預計是因爲列N'列'COLUMN'超出範圍值,但我沒有想到MySQL控制檯(不顯示警告)和SQLyog(顯示警告)會允許以下UPDATE查詢:

UPDATE TABLE SET COLUMN = 100000; /* No matter it's out of range for FLOAT(8, 3), it's trimmed but not via JDBC MySQL driver*/ 

顯然這是MySQL連接器的特定問題。它是MySQL連接器的錯誤(目前我使用的是mysql-connector-java-5.1.12-bin.jar)?或者是否有任何快速解決方法允許將JDBC驅動程序修剪或調整100000(理想情況下爲最大值)?

在此先感謝。

回答

1

聽起來就像你被四捨五入燒燬一樣。

如果使表格列9,3或10,3而不是8,3會發生什麼?不要更改驗證代碼,只是列def。

你可以使用一個整數列與假定的小數點嗎?也就是說,1將被存儲爲1000. 3.221將被存儲爲3221.在顯示數字之前,您必須知道除以1000。

這裏有關於problems with MySQL Float的討論。

+0

謝謝你的回覆。是的,這完全是一個四捨五入的問題。不幸的是我目前無法改變表格的定義,但我敢肯定100000在這種情況下會通過,因爲它在FLOAT(9,3)範圍內。此外,我不能將列類型更改爲整數,尤其是小數點位置。我現在可以建議解決此問題的最佳方式是以某種方式更改MySQL JDBC驅動程序的行爲,以便使其處理像MySQL控制檯所使用的驅動程序那樣的查詢。我不知道如何... – 2010-09-24 21:21:27

+0

好的,你可以添加一個更友好的類型的新列,從第一列填充它,並有時使用新列?風險更大,但可能比更換駕駛員風險更小。或者,您可以確定是否存在一小部分錯誤操作的值並破壞您的DAO在這些情況下返回適當的值?我確信MySQL人員有一個(非免費)支持服務。也許他們可以幫忙。 – 2010-09-24 22:47:37

+0

我對這些黑客有同樣的想法,但他們仍然是黑客,並且可能需要更多時間來實現和執行,因爲我們應該始終關注從數據庫中取得適當的N和M值,因爲我們使用各種FLOAT(N,M ) 那裏。 – 2010-09-24 23:08:59