最佳项目踩过的坑,特意来记录下,希望没有踩坑的人理解深刻!
datetime
datetime存储字符串,mysql存的时候是什么,返回的时候就是什么。关键点是没有时区的转换。mysql不会根据客户端等所在的时区来显示,而是存的是什么,显示的时候就是什么。如北京时区连接主库,存入“-09-:58:44”,洛杉矶时区查看从库也是显示“-09-:58:44”,数据不会改变!
timestamp
timestamp也是存储字符串,但是跟datetime不同的是,timestamp会根据时区不同显示不同。如主库在北京,存入“-09-:58:44”,而洛杉矶从库查看时,显示的时间不是“-09-:58:44”,时间上少了15或16个小时。因为timestamp会根据时区来做特殊显示。
int
int这个简单,存储的就是int类型数据,不会变化。但是直接查表不好看,而且不能自动更新,必须要程序传入。
坑
如果业务是全球,特别是服务器部署在美国,时间格式大部分采用int,数据通过程序的服务器时间传入。因为存在的坑有:1、mysql启动时,如阿里云RDS启动后时区不会变化。这个放在国内没有问题,但是美国时区分为两个,服务器会自动切换,而数据库不会。2、timestamp会根据当地时区显示,如果设置为自动更新则时间也是变化的。datetime也是一样,自动存储时也会根据时区发生变化。
解决
1、全部采用int,直接程序写入。这个是要在表设计之初就要做好,程序开发时就得这样做。2、如果表设计为datetime或timestamp时,服务器还是在美国,可以把服务器和mysql的时区直接改成东八区。回到咱大祖国来安全些!
我是一线码农,喜欢我的文章