新项目可能存在国际化的问题,所以花了点时间了解了下 MySQL 和 JDBC 驱动相关的时间问题。看了好多篇博客发现,不少人理解的都是错误的,所以结合官方的文档,重新梳理了一下。
大家都知道在 MySQL 中有两个专门用来存取日期时间的类型,timestamp 和 datetime。大家总是说 datetime 不包含时区信息,timestamp 存的 utc 时间戳更适合国际化场景下的本地时间转换。经过了解,上述说法对,但不完全对。
版本信息:
- MySQL5.7
- mysql-connector-java 8.0.31
MySQL 用什么类型存日期时间?
目前可以存日期时间的数据类型主要分两类:
- bigint:直接将 utc 时间戳存到 int 类型的字段中。后期根据用户本地时区进行转换。
- 日期时间类型: timestamp:MySQL 官方定义的时间戳,内部使用 utc 时间戳存储,但查询时返回的结果会随着 session time_zone 的变化而变化。 datetime:只存日期时间的值,不包含时区信息。
那么我们应该选择哪个?先说结论在分析,根据需求选 bigint 或 datetime。
类型 |
优点 |
缺点 |
bigint |
1. 直观,不需要考虑时区 |
1. 数据库直接查看时可读性差,需要转化 |