Десятичная точность 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())

0 ответов

Другие вопросы по тегам