十进制值中的“MySQL INSERT INTO ... SELECT”错误

时间:2012-12-11 09:26:26

标签: mysql type-conversion

这是我的疑问:

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部分并自行运行,没有这样奇怪的值。)

1 个答案:

答案 0 :(得分: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)