Mysql Rails 3和保存表单中的十进制值

Mysql Rails 3和保存表单中的十进制值,mysql,ruby-on-rails,forms,Mysql,Ruby On Rails,Forms,我的一个应用程序中有一个奇怪的bug 当我使用sqlite3数据库时,错误并不存在。然而,当我使用mysql2作为数据库适配器时,我在保存表单中的十进制值时遇到了一个错误 如果我提交值19.99,则在删除小数点后,我的输入将作为19.00存储在数据库中 这是什么原因造成的?数据库具有正确的列设置,我可以使用rails控制台创建正确的记录 编辑:当我真的想说十进制时,我说的是整数。我认为这可能是以下几种可能性之一: Rails模型(或控制器中的某个步骤)中的验证是在保存到数据库之前将值设置为整数,

我的一个应用程序中有一个奇怪的bug

当我使用sqlite3数据库时,错误并不存在。然而,当我使用mysql2作为数据库适配器时,我在保存表单中的十进制值时遇到了一个错误

如果我提交值19.99,则在删除小数点后,我的输入将作为19.00存储在数据库中

这是什么原因造成的?数据库具有正确的列设置,我可以使用rails控制台创建正确的记录


编辑:当我真的想说十进制时,我说的是整数。

我认为这可能是以下几种可能性之一:

  • Rails模型(或控制器中的某个步骤)中的验证是在保存到数据库之前将值设置为整数,或至少截断小数。若要查看是否存在这种情况,请检查日志中的
    INSERT
    操作,并查看Rails试图放入的数据

  • 如果Rails发送的是
    19.99
    ,而不是
    19.00
    ,则两个数据库中的数据类型很可能存在微小差异。检查MySQL数据库是否只是没有存储小数位数为2或更高的小数。默认情况下,MySQL存储的数据类型精度为10,小数位数为0,因此不存储小数

  • 如果问题出在#2,那么解决方案是生成一个迁移并“更改”字段类型以指定比例,类似于:

    # 'up' portion of a new migration
    def self.up
      change_column :mymodel, :myfield, :decimal, :precision => 6, :scale => 2
    end
    

    值是否正确地保存在mysql表中?不,从rails日志中可以看到,它被正确地提交到mysql。我将看看是否可以在考虑SSCIRUS解决方案的情况下再次编辑我的迁移,并确保所有内容都是正确的。谢谢!你救了我一命,让我不至于因为这件事而大发雷霆。我一定是在迁移过程中输入了错误,或者只是没有像我应该检查的那样彻底。解决方案是在我的迁移中,在列定义的末尾添加:precision=>6,:scale=>2。如果在同一个表中有一组列要更改,您可能还会喜欢其他语法:change_table:mymodel do | t | t.change:myfield,:decimal,:precision=>6,:scale=>2这个问题和答案刚刚救了我。非常感谢。