这是我的查询:
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.6
和1.8
变得1.60000002384186
和1.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在源数据中似乎没有时插入这些奇怪的小数?(获取INSERT
查询的SELECT
部分并自行运行它,没有这种奇怪的值)。
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)
INSERT INTO your_insert_table (SELECT your_select_table REPLACE(t1.`price`, ',', '.'))