Ruby on Rails:为什么ActiveRecord使用“datetime”类型而不是“timestamp”来表示时间戳字段?
在我的数据库迁移文件中,我插入了以下行:
t.timestamps
正如我所料,创建了两列:“updated_at”和“created_at”。 但是,它们的类型是“datetime”而不是“timestamp”。
我正在使用MySQL和“timestamp”类型,据我所知,它是专门为这种情况设计的 ,因为它占用的空间更少,并且与时区无关。
那么,有什么理由,为什么Rails 3使用“datetime”而不是“timestamp”? 我应该尝试解决这个问题吗? 如果是,除了不使用“t.timestamps”并且每次为每个新表分别定义“updated_at”和“created_at”列时,有没有办法做到这一点?
从内存中,mysql timestamp
列类型的行为类似于updated_at
,因为每当更新记录时,它都会使用当前时间进行更新。
虽然这对updated_at
列很有用,但这不是created_at
所需的行为。
此外,Rails处理应用程序设置中指定的时区(通常应设置为UTC),因此使用mysql的时间可能与其他日期时间记录不一致。
timestamp
列具有有限的范围,从1970年开始到2038年结束。您可以谷歌“Unix Millennium Bug”获取更多信息,但这主要是因为unix时间戳存储为32位有符号整数。 时间戳以1970年1月1日以秒为单位表示,并且该数字在2038年自行包装。因此,即使timestamp
看起来更简单,我通常也会使用datetime
timestamp
,尤其是将历史数据或预测数据进一步表示为过去或将来。