这是我的疑问:
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看起来不在源数据中时会插入这些奇怪的小数? (采用SELECT
查询的INSERT
部分并自行运行,没有这样奇怪的值。)
答案 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)