Десятичная точность MySQL 5.7 потеряна после оператора MySQL '+'
ддл:
CREATE TABLE `tests` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`num` decimal(40,20) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
sql:
query=UPDATE `tests` SET `num` = ? WHERE `tests`.`id` = ? args=\[1.11111111111111111 1\]
query=UPDATE `tests` SET `num` = COALESCE(`tests`.`num`, 0) + ? WHERE `tests`.`id` = ? args=\[1.11111111111111111 2\]
результат:
MySQL5.7:
id=1, num=1.11111111111111111000
id=2, num=**1.11111111111111120000** why?
MySQL8.0:
id=1, num=1.11111111111111111000
id=2, num=1.11111111111111111000
Почему одно и то же утверждение может дать разные результаты?
код:
c, err := ent.Open("mysql", "root:root@tcp(127.0.0.1:3306)/test?charset=utf8", ent.Debug())
if err != nil {
return
}
// c.Test.Create().SetName("a").SetNum(decimal.Zero).Exec(context.Background())
// c.Test.Create().SetName("a").SetNum(decimal.Zero).Exec(context.Background())
val, _ := decimal.NewFromString("1.11111111111111111")
c.Test.Update().SetNum(val).Where(test.ID(1)).Exec(context.Background())
c.Test.Update().AddNum(val).Where(test.ID(2)).Exec(context.Background())