最近我們在使用MySQL時遇到了一個非常奇怪的問題,就是使用SUM求和時得到的結(jié)果與我們預(yù)期的結(jié)果差距非常大,而且這種差距并不是偶然發(fā)生的。
經(jīng)過分析,我們發(fā)現(xiàn)這個問題是由于MySQL的數(shù)據(jù)類型轉(zhuǎn)換規(guī)則引起的。在求和時,MySQL會將非數(shù)字類型的數(shù)據(jù)自動轉(zhuǎn)換為浮點(diǎn)數(shù),然后再進(jìn)行求和計算。但是由于浮點(diǎn)數(shù)在計算機(jī)中的存儲方式以及精度問題,可能會導(dǎo)致求和結(jié)果出現(xiàn)嚴(yán)重誤差。
-- 示例代碼 CREATE TABLE demo ( id INT(11) PRIMARY KEY, amount VARCHAR(255) ); INSERT INTO demo (id, amount) VALUES (1, '10.1'); INSERT INTO demo (id, amount) VALUES (2, '20.2'); INSERT INTO demo (id, amount) VALUES (3, '30.3'); -- 使用SUM函數(shù)求和 SELECT SUM(amount) FROM demo; -- 實(shí)際結(jié)果為:60.599999999999994 -- 預(yù)期結(jié)果為:60.6
為了避免這個問題,我們可以在求和時使用CAST函數(shù)將非數(shù)字類型的數(shù)據(jù)轉(zhuǎn)換為DECIMAL類型,然后再進(jìn)行求和計算。這樣可以減小求和誤差。
-- 示例代碼 SELECT SUM(CAST(amount AS DECIMAL(18,2))) FROM demo; -- 實(shí)際結(jié)果為:60.60 -- 預(yù)期結(jié)果為:60.6
總之,MySQL的數(shù)據(jù)類型轉(zhuǎn)換規(guī)則可能會導(dǎo)致SUM求和結(jié)果出現(xiàn)誤差,要注意使用CAST函數(shù)進(jìn)行類型轉(zhuǎn)換以減小誤差。