文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

浅谈Mysql时间的存储 datetime还是时间戳timestamp

2024-04-02 19:55

关注

简单对比

占用空间

MySQL 常用的日期时间类型常用的是datetime、timestamp。除此之外 还有用的不多的YEAR DATE TIME
注意5.6.4的版本

在这里插入图片描述

从上表可以看到,DATETIME默认占用5个字节,而TIMESTAMP默认占用4个字节,如果需要更高精度的存储(秒后的小数点个数,比如毫秒)那么需要额外的存储空间。

优缺对比

timestamp在mysql中定义的是int类型的数据,然后1970年到2038年的秒数刚好21亿,为了限制,所以只能截止到2038年。虽然现在可以设置数字精度了 但是数据精度提高的代价是其内部存储空间的变大,但仍未改变时间戳类型的最小和最大取值范围。
**但是我觉得吧 随着时间临近,mysql会更新的。**而且还有这么多年呢 肯定也会有其他东西取代他

此外还有语言提供的字符串类型,10位(精确到秒)或13位(精确到毫秒)。其中13位必须bigint存储,占用8字节,而且在显示的时候,mysql不会自动转成我们常见的日期格式,所以不推荐使用。

在这里插入图片描述

如何存储毫秒或者更高级别的小数?

实际运行的时候在保存的时候,

意思就是,毫秒部分需要以参数形式传参给数据类型,默认是不保存毫秒的,可以保存1-6位。如果需要保存三位的毫秒值,数据类型可以定义为DATETIME(3)TIMESTAMP(3),不需要保存毫秒的话,只需要将类型直接写为DATETIME TIMESTAMP。

在这里插入图片描述

时间戳详解

一个方便的用法

在创建新记录和修改现有记录的时候都对这个数据列刷新:(datetime也能用)

TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

显示格式(非存储格式)

TIMESTAMP值可以从1970的某时的开始一直到2037年,精度为一秒,其值作为数字显示。
TIMESTAMP值显示尺寸的格式如下表所示:

+---------------+----------------+
| 列类型    | 显示格式    |
| TIMESTAMP(14) | YYYYMMDDHHMMSS | 
| TIMESTAMP(12) | YYMMDDHHMMSS  |
| TIMESTAMP(10) | YYMMDDHHMM   |
| TIMESTAMP(8) | YYYYMMDD    |
| TIMESTAMP(6) | YYMMDD     |
| TIMESTAMP(4) | YYMM      |
| TIMESTAMP(2) | YY       |
+---------------+----------------+

“完整”TIMESTAMP格式是14位,但TIMESTAMP列也可以用更短的显示尺寸,创造最常见的显示尺寸是6、8、12、和14。
你可以在创建表时指定一个任意的显示尺寸,但是定义列长为0或比14大均会被强制定义为列长14。
列长在从1~13范围的奇数值尺寸均被强制为下一个更大的偶数。
这有以下含义

java可能遇到的坑

详情请看原文:原文链接:https://www.jb51.net/article/255355.htm
送 sql 前,会将 jdbc 中的 Date 对象参数,根据 serverTimeZone 配置的时区转化为日期字符串后,再发送 sql 请求给 mysql server,同样在 mysql server 返回查询结果后,结果中的日期值也是日期字符串,mysql 驱动会根据 serverTimeZone 配置的时区,将日期字符串转化为 Date 对象。

因此,当 serverTimeZone 与数据库实际时区不一致时,会发生时区转换错误,导致时间偏差,如下:

a、比如 sql 参数是一个 Date 对象,时间值是东 8 区的2020-02-23 08:00:00,注意它里面存储的可不是2020-02-23 08:00:00这个字符串,它是 Date 对象(绝对时间),只是我用文字表达出来是东 8 区的2020-02-23 08:00:00。

b、然后,由于 serverTimeZone 配置的是东 8 区,mysql 驱动会将这个 Date 对象转为2020-02-23 08:00:00,注意这时已经是字符串了,然后再将 sql 发送给 mysql,注意这里的 sql 里面已经将 Date 参数替换为2020-02-23 08:00:00了,因为 Date 对象本身是无法走网络的。

c、然后 mysql 数据库接收到这个时间字符串2020-02-23 08:00:00后,由于数据库时区配置是东 9 区,它会认为这个时间是东 9 区的,它会以东 9 区解析这个时间字符串,这时数据库保存的时间是东9区的2020-02-23 08:00:00,也就是东8区的2020-02-23 07:00:00,保存的时间就偏差了 1 个小时。

d、查询结果里时间为什么又对了呢,因为查询结果返回了东 9 区的时间字符串,而 java 应用又将其理解为是东 8 区的时间,负负得正了!

时间戳查询的时候 能否返回原生的时间戳呢

到此这篇关于浅谈Mysql时间的存储 datetime还是时间戳timestamp的文章就介绍到这了,更多相关Mysql时间的存储 内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯