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.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)

しかし、列が常に10進値を受け取るとは限らないため、それはできません。

ソースデータに含まれていないように見えるのに、MySQLがこれらの奇妙な小数を挿入するのはなぜですか?(クエリのSELECT一部を取得INSERTしてそれ自体を実行すると、そのような奇妙な値はありません)。

4

1 に答える 1

1

列に格納された数値は、DECIMAL内部的に文字列として処理されます。このように、バイナリ ベースとの間の変換によるデータの損失はありません。

ただし、MySQLは、値が列から取得され、値が自動的に にキャストされることを忘れることがあります。これは、精度が失われる純粋な数値列タイプです。これはかなりまれであり、その理由はよくわかりませんが、値がサブクエリから取得された場合に発生する傾向があります。DECIMALFLOAT

あなたの場合、数値の最終的な宛先は文字列であるため、できるだけ早く文字列にキャストすることをお勧めします。

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 に答える