2012-12-11 94 views
0

錯誤這裏是我的查詢:「MySQL的INSERT INTO ... SELECT」 十進制值

INSERT INTO `temp_map_196` 
(SELECT DISTINCT 
    NULL,NULL,NULL, 
    t1.`price`, 
    t1.`price`, 
    COUNT(*) AS `count` 
FROM `raw_table_1` t1 
GROUP BY `price` 
ORDER BY `count` DESC) 

t1.priceDECIMAL列。這些值將被插入到varchar列中。

1, 10, 10.5所有得到正確插入。

1.61.8成爲1.600000023841861.79999995231628

如果我更改查詢到這一點:

INSERT INTO `temp_map_196` 
(SELECT 
    NULL,NULL,NULL, 
    1.6, 
    1.6, 
    1 
) 

,一切工作正常。

INSERT INTO `temp_map_196` 
(SELECT DISTINCT 
NULL,NULL,NULL, 
CAST (t1.`price` AS DECIMAL(8,2)), 
CAST (t1.`price` AS DECIMAL(8,2)), 
COUNT(*) AS `count` 
FROM `raw_table_1` t1 
GROUP BY `price` 
ORDER BY `count` DESC) 

但我不能這樣做,因爲該列不會總是得到十進制值:當我改變原來的查詢

一切也適用。

爲什麼MySQL在它看起來不在源數據中時插入這些奇怪的小數? (以SELECT部分查詢INSERT並單獨運行它,沒有這樣奇怪的值)。

+0

'但是我不能這樣做,因爲該列將不會總是接收小數值。「 - 爲什麼你不總是接收小數值?那不可能是因爲'價格'是十進制的。 –

+0

爲什麼要訂購用於填充任一表的查詢?這似乎有點w漏。 – paxdiablo

+0

嘗試'CAST(t1.price AS CHAR)' – Omesh

回答

1

存儲在DECIMAL列中的數字在內部作爲字符串處理。這樣,由於從/到二進制庫的轉換,不會有數據丟失。

然而,有時MySQL的忘記一個值來自DECIMAL柱和值獲得自動轉換爲FLOAT,這是一個純粹的數值列型這是受精度損失。這很少見,我不完全確定其原因,但當值來自子查詢時,它往往會發生。

在你的情況,自號的最終目的地是一個字符串,我建議你儘快轉換爲地:

INSERT INTO `temp_map_196` 
(SELECT DISTINCT 
NULL,NULL,NULL, 
CAST (t1.`price` AS CHAR), 
CAST (t1.`price` AS CHAR), 
COUNT(*) AS `count` 
FROM `raw_table_1` t1 
GROUP BY `price` 
ORDER BY `count` DESC)