当前位置: 首页 > 科技观察

数据库到底应该存储什么类型的时间呢?

时间:2023-03-18 23:44:07 科技观察

“是啊,我最近设计了一个新项目的数据库表结构,发现时间字段类型在其他项目之前的表中并不统一,我有点麻木了。”老陈眨着眯着的眼睛,看着我。“它对int、TIMESTAMP和DATETIME有用吗?”我很久以前就发现了这种混乱。每个人自己设计,没有统一的类型。“对对对,你觉得应该选哪个?”老陈又要给我温暖了,我连忙回道:“首先,这个int类型得先淘汰,虽然从功能上来说用int来存储时间戳是没毛病的,但也只能最多能保存到2038年,不过我不知道重点,今年才几年,这么多,说不定到时候项目就G了。”“重点是,int不能使用DEFAULTCURRENT_TIMESTAMP和ONUPDATECURRENT_TIMESTAMP。”DEFAULTCURRENT_TIMESTAMP插入记录时,如果不指定时间,默认填写当前时间。ONUPDATECURRENT_TIMESTAMP当记录被修改时,时间自动更新,相当于自动修改记录的更新时间,不需要人为取值。这两个东西很好用,很方便,不然你得显示相关的SQL来插入修改当前时间语句。麻烦!而且容易漏水!编程最重要的是简单和方便,所有花里胡哨的东西都是容易出错的。老陈听完,认真地点了点头,示意我继续。鱼上钩了,岂能轻易放手!我故作迟疑,看了一眼他桌上的抗原检测试剂。这些东西最近都变成硬通货了,网上根本买不到。老陈会意,双手捧着一个盒子,轻轻放在我的办公桌上。我点点头继续说道:“至于TIMESTAMP,5.6及以上版本支持TIMESTAMP(N)N表示秒的小数位,最多六位,但只能存储到2038年,本质上和int一样,他们都是时间戳,但是数据库可以操作它们来转换时区!”时间戳存储的是从'1970-01-0100:00:00'到现在的毫秒数,没有时区的概念,而MySQL的TIMESTAMP类型可以指定时区返回不同的时间。为简单起见,让我使用SELECTNOW()作为不同时区的示例。比如我现在不指定时区,默认就是操作系统的时区。返回结果如下图所示:现在我把时区改成卡塔尔了。你看,时间变了吗?TIMESTAMP有这样的作用。老陈定睛一看,突然说道:“世界杯的时间真不友好,我们都是凌晨三点才开始比赛,你看,我长痘痘了!毁了我帅气的脸!”话说回来,这个时区功能就不用了,我在服务器端改时区就可以了对吧?”我厌恶地看了他一眼,无视他的得意:“对啊,如果需要时区,服务器直接把时区传给前端,用MySQL传时区有个小坑!”因为TIMESTAMP绑定了时区的属性,所以每次都要用时区来计算时间。如果MySQL没有指定时区,那么默认情况下,每次需要查看操作系统的时区,都得调用操作系统底层的__tz_convert函数,这个函数会被加锁,加锁的意思资源竞争!高并发时,影响可能更大!所以如果非要使用TIMESTAMP,记得在MySQL配置文件中明确设置时区!“OKOK,那我不用int也不用TIMESTAMP,我就用DATETIME!如果你不知道这个东西,它就不行了,对吧?”我搓了搓手,又看了看桌上他刚收到的快递,看包裹好像是KN95口罩?顺着我的目光,老陈心疼的上前,拆开包裹扔给我,骂骂咧咧地说:“这狗日的面膜不仅难买,而且很贵,前不久这东西才1块钱,现在5块钱!真是黑心商家!”“不行,我在网上下了十几单,能承受涨价,而且都是预购的!交货期在1-45天……”我抱怨道,“好吧,别不说这个,继续说DATETIME。”DATETIME不限2038,可以保存到9999-12-3123:59:59,无时区属性,支持DEFAULTCURRENT_TIMESTAMP和ONUPDATECURRENT_TIMESTAMP。DATETIME(N)中的N表示秒的小数位,最多6位,5.6及以上版本也支持。这个N可能只是说你没有直觉影响力。我以SELECTNOW为例:所以DATETIME其实没有缺点。非要说的话,可能占的篇幅会比这大。看下图:对了,上图中还有一个DATE类型,这个就不说了,它只能存日期,不能存时分秒。老陈摸了摸自己的大光头,“明白了,问题是DATETIME!”孩子是可以教的!我埋头整理桌上的KN95和抗原,美滋滋:“果然,知识就是金钱!古人没有骗过我!”更多故事,请收听下一章分享!