
“yes,最近设计一个新项目的数据库表结构,别的项目以前的表,发现这个时间字段类型都没个统一,我有点麻了。”
老陈眨了眨他的眯眯眼,望向了我。
“是不是有用 int、有TIMESTAMP 还有 DATETIME 的?” 我早就发现了这个乱象,大家都各自设计各自的,没个统一的类型。
“对对对,你说应该选哪个好?”
老陈又要给我送温暖了,我赶紧回答道:“首先,这个 int 类型得先淘汰了,虽然从功能来说用 int 存储时间戳没毛病,不过最多就只能存到 2038 年,不过这也不知重点,今年才几几年,管那么多,指不定到时候项目都 G了。”
“重点是,int 用不了DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP。”
DEFAULT CURRENT_TIMESTAMP
当记录插入的时候,如果没有指定时间,那么默认填入当前时间。
CURRENT_TIMESTAMP
当记录修改时,自动更新时间,相当于自动修改记录的更新时间,不需要人为塞值。
这两个玩意就很好使了,非常方便,不然相关的 SQL 你都得显示的写入插入和修改当前时间的语句。
麻烦!且容易漏!编程这玩意最重要的是简单、便捷,花里胡哨的都容易出错。
老陈听完,煞有其事地点了点头,示意我继续。
鱼儿已经上钩,我怎能轻易放过!
我故作停顿,瞟了眼他桌上的抗原检测试剂,这玩意最近可是硬通货,网上压根买不着了。
老陈心领神会,双手捧着一盒,轻轻地放在我的桌上。
我点了点头,继续说道:“至于 TIMESTAMP 的话,5.6版本以上支持 TIMESTAMP(N) N 表示秒的小数位,最高可达六位,不过它也只能存到 2038 年,本质上跟 int 一样,都是时间戳,不过数据库可以操作它进行时区的转换!”
时间戳存的就是’1970-01-01 00:00:00′ 到现在的毫秒数,没有时区的概念,而 mysql 的 TIMESTAMP 类型可以指定时区返回不同的时间。
简单点,我拿SELECT NOW()来举例不同时区的情况。
比如我现在不指定时区,默认就是操作系统的时区,返回的结果如下图所示:
然后我现在整个把时区变成卡塔尔的,你看看,时间是不是就变了?TIMESTAMP 就是有这样的功效。
老陈定睛一看,冷不丁地冒出一句:“这丫的世界杯时间真不友好,老是在我们凌晨 3 点踢,你看看,熬的我都长痘痘了!破坏我英俊的脸庞!”
“话说回来,这时区功能不是必备的呀,我在服务端转个时区不就得了嘛?”
我嫌弃地瞄了他一眼,忽略他的臭美:“没错,如果有分时区的需求,服务端直接转时区塞给前端就行了,而且利用 MySQL 转时区还有小坑!”
因为 TIMESTAMP 绑定了时区的属性,所以每次都需要利用时区来计算时间,如果我们 MySQL 没有指定时区,那么默认就需要每次查看操作系统的时区,就得调用操作系统底层的__tz_convert函数,会加锁,而加锁就意味着资源争抢!
在高并发的时候,影响可能就会比较大了!
所以如果非要用 TIMESTAMP ,那么记得在 MySQL 配置文件中显示设置时区!
“OKOK,那我就不用 int 也不用 TIMESTAMP ,就用 DATETIME 了!不会这玩意也不好使吧?”
我搓了搓手,又瞄向了他桌上刚收到的快递,看这包装好像是 KN95 口罩?
老陈顺着我的目光,心疼地移步向前拆开包装扔给了我一包,骂骂咧咧道:“这狗日的口罩,现在不仅难买还很贵,这玩意前不久还 1 块钱,现在要 5 块!真是些黑心商家!”
“可不嘛,我在网上下了十几单,涨价我忍了,还都是预售的!发货时间1-45天内….”我吐槽道,“行了,不扯这个,继续说 DATETIME。”
DATETIME 没有 2038 的限制,可以存到9999-12-31 23:59:59,也没有时区属性,并且支持DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP。
DATETIME(N) 中的 N 表示秒的小数位,最高可达 6 位,也是 5.6 版本以上支持。
这个 N 可能光说你没直观的影响,我还是拿SELECT NOW举个例子:
所以 DATETIME 其实没啥缺点,如果非要说个的话可能就是空间的占用了相比会大些了,看下下面这个图:
老陈摸了摸他的大光头,“懂了,问就是 DATETIME!”
孺子可教!
我埋头理了理桌上的 KN95 和抗原,美滋滋:“果然知识就是金钱啊!古人诚不欺我!”
更过故事,请听下回分享!
oracle数据库中有哪些字符集,字符集之间的子集和超集关系是怎么样的?
oracle数据库的字符集有很多的,具体的也不能一一详细地列举出来了,但是,建库的时候,会有选择字符集的界面,点开下拉条,将会列出oracle所支持的所有字符集(10/12)。 超集与子集是包含和被包含的关系,超集兼容子集。
sql定义字段时,数据类型是如何确定的?
根据你想要存放的数据的类型来确定,使用正确的数据类型,在处理数据时速度上会有优势而且也很方便。 比如你想要存放整数,则可以考虑用int类型,如果你要放的数字大小有可能超过int类型的最大允许范围,则考虑用long类型或其他存放大数字的类型;如果你要存放字符串类型,则可以考虑用varchar类型或char类型,varchar和char都可以指定长度,不同的是,varchar存放的数据长度在指定长度内多长就是多长,而char则不足指定长度会以空格填充;如果你要存放日期时间类型的数字,而可以考虑使用datetime类型,以此类推,不一而足。 以上说的都是大多数场合常用的字段类型。
sql的datetime和smalldatetime怎么用?
一般情况下就用datetime就是了,smalldatetime精度太低了,判断时间的时候很容易弄错,等你用熟练了sql再使用smalldatetime吧,在c#里面拼一个string类型的sql语句就可以存储时间,如:string TestSql= insert into TestTable set TestDateTime=+ () + ;或者string TestSql= insert into TestTable set TestDateTime=2010-3-5 ;或者string TestSql= insert into TestTable set TestDateTime=2010-3-5 11:03:11 ;上面的代码复制粘贴到程序里去试试看就会有体会了。
发表评论