【问题标题】:Does changing data type decimal to float cause data loss?将数据类型小数更改为浮点数会导致数据丢失吗?
【发布时间】:2011-05-15 04:52:45
【问题描述】:

我需要更改数据库中的几个字段:

:decimal, :precision => 8, :scale => 5

到:

:float

这种迁移会导致数据丢失吗?当前数据由 0 到 999 之间的整数组成。

如果此迁移会影响这些已存储的数字,我该如何保证这些数据的安全?

设置:在 Heroku 上运行的 Ruby on Rails 3(解决方案需要同时适用于 PostgreSQL 和 MySQL)。

【问题讨论】:

    标签: sql ruby-on-rails ruby-on-rails-3 migration


    【解决方案1】:

    如果您需要对您的数字进行精确比较或浮点运算,它会。打开 PostgreSQL 试试这个:

    select floor(.8::float * 10.0::float); -- 8
    select floor((.1::float + .7::float) * 10.0::float); -- 7
    

    查看这个相关问题的原因:

    Why do simple doubles like 1.82 end up being 1.819999999645634565360?

    【讨论】:

    • 感谢您的回答 - 我更关心的是真的丢失我的数字,而不是让它们稍微偏离原来的价值。如果该字段从限制性小数变为浮点数或更广泛的小数(精度更高),我认为这意味着我的数据将保持安全?
    • 好吧,在这种情况下是的,如果你使用ALTER TABLE 语句来修改列的类型,你是安全的。 RoR 也可能完成这项工作,我真的不知道——但如果是这样,我会更信任我输入的内容,而不是基于 ruby​​ 的 SQL diff 工具。
    【解决方案2】:

    介于 0 和 999 之间的整数都适合,并且数据不会受到影响。如果它只是整数 - 为什么不使用ints?

    【讨论】:

    • 它并不总是整数 :)
    • 所以,只要当前数据真正适合新数据类型,就可以了?
    • 我想是这样 - 您可以随时备份您的 development.db 以防万一。如果在恢复备份之前出现问题,请从更改中迁移回来。
    猜你喜欢
    • 2022-08-02
    • 2019-08-20
    • 1970-01-01
    • 1970-01-01
    • 2018-03-24
    • 1970-01-01
    • 1970-01-01
    • 2012-06-14
    • 1970-01-01
    相关资源
    最近更新 更多