2013-01-21 75 views
2

我在MySQL中存儲值時遇到了一個非常奇怪的問題。前提:PHP float/double存儲爲MySQL DECIMAL

我有一個使用DECIMAL(15,8)存儲貨幣值(如總的順序)的表,但是當我嘗試插入例如:

2,45545345 

這個存儲爲

2.00000000 

我試過MySQL的FORMAT/CAST函數,但仍然是相同的輸出。

這是查詢獲取如何產生的:

$db->query("INSERT INTO `random_table_name` SET currency_value = '" . floatval($value) . "'"); 

我也嘗試doubleval,但同樣的結果。有趣的是,雖然這段代碼在幾周前運行良好,但我不記得任何可能導致此結果的db結構或db類的更改。

+1

您的腳本是否使用'setlocale'? –

+0

是的,但我無法關閉它或刪除它。 – Anonymous

+0

它是什麼語言環境? 'floatval'會根據語言環境將''2,45545345「'轉換爲'2.0'或'2.45545345'。 –

回答

7

使用number_format更換,.

像這樣:

number_format($value, 8, '.') // 8 = number of decimals, . = decimal separator 

然而,您的問題似乎與當前語言環境。你需要考慮以下幾點:setlocale()localeconv

setlocale(LC_ALL, 'en_US'); // NOT TESTED, read up on the appropriate syntax 

這是這樣做的適當的方式,另一種方法是(如下建議),做一個str_replace(',', '.'),但你必須做反向每你想輸出字符串的時間。

但還有另一個選項,您可以將MySQL語言環境設置爲en_US

+0

'number_format'似乎不喜歡','。 –

+0

不是一個解決方案,因爲它會產生相同的結果 - 2.0000000000 – Anonymous

+0

確實。您需要先設置適當的區域設置。美國語言環境應該做的竅門,不知道語法,所以我添加了鏈接,以便您可以查看它。 –

3

插入數據庫之前更換,.

$value = str_replace(',', '.', $value); 

這將創建一個有效的數字,可以安全地插入到數據庫中。或者只是將其添加到您的查詢中:

INSERT INTO `random_table_name` SET currency_value = '" . str_replace(',', '.', $value) . "' 
+0

我嘗試的第一件事情之一 - 不起作用,值被數據庫取整爲2 – Anonymous

+0

'str_replace'不能將您的數字四捨五入爲2 – Peon

+0

str_replace不會,但是DB將該值存儲爲2.000000,即使當使用MySQL的CAST/FORMAT函數 – Anonymous