最近在项目中碰到一个奇怪的现象:商品表中明明有价格为 72.05 元的商品,用"价格等于 72.05"的条件却检索不出来。
Product.where(price: 72.05).first
但是如果用区间条件的话,是能检索出来该商品的:
Product.where("price > ?", 72).where("price < ?", 73)
开始以为是 ruby 程序的问题,后来直接在 mysql 命令行下用 sql 语句去检索,问题一样存在,看来是数据库本身的问题。
反复检查以后,发现价格字段类型是 float 类型。使用 alter 的语句将价格字段修改成decimal (总位数,小数点后位数)
,问题得到了解决。
-- SQL 语句:
ALTER TABLE products MODIFY COLUMN price decimal(10,2);
当然,在 rails 项目里,按照流程还是必须创建和执行如下的 migration 的。不过不知道为什么这个操作并不能反映到 mysql 上,所以只能额外手工执行上面的 mysql 操作。
class ChangePirce < ActiveRecord::Migration[5.2]
def change
change_column : products, :price, :decimal, :precision => 10, :scale => 2
end
end
关于 float 与 decimal 类型的区别,看起来不起眼,但是不注意的话会掉到这样的坑里去。这次的经验让我明白,以后跟金额相关的字段,统统明确用 decimal 类型。