0

这是我的查询:

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.price是一DECIMAL列。这些值被插入到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并自行运行,没有这种奇怪的值)。

4

1 回答 1

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)
于 2012-12-11T09:38:16.507 回答