首先 如果定义的是timestamp类型 或者是date类型,插入的时候应该插入格式化好的日期,而不是直接插入时间戳
类似下面,插入之后 1497的这个插入结果是"0000-00-00 00:00:00"
insert into qssq (updatedAt)values(‘2017-09-12 13:40:33’);
insert into qssq (updatedAt)values(‘1497016062’);

简单对比

占用空间

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

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

优缺对比

  • DATETIME占用字节较多,但表示范围较大,与时区无关。
  • TIMESTAMPA:只能表示1970-2038年的时间,且B:不能用于分区列(真的么?还得查查 好像又不一定 也有说 官方文档说从MySQL 5.1.43开始,除了TIMESTAMP 外,其他日期类型都不接受!?),因为这种数据类型受时区限制,会受数据库时区的影响。**C:**当MySQL参数time_zone=system时,查询timestamp字段会调用系统时区做时区转换,而由于系统时区存在全局锁问题,在多并发大数据量访问时会导致线程上下文频繁切换,CPU使用率暴涨,系统响应变慢设置假死。(但C似乎只在一个博客看到这个问题,真的存在么?)为了避免这种问题,记得手动设置时区

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范围的奇数值尺寸均被强制为下一个更大的偶数。
这有以下含义

  1. 虽然你建表时定义了列TIMESTAMP(8),但在你进行数据插入与更新时TIMESTAMP列实际上保存了14位的数据(包括年月日时分秒),只不过在你进行查询时MySQL返回给你的是8位的年月日数据。如果你使用ALTER TABLE拓宽一个狭窄的TIMESTAMP列,以前被“隐蔽”的信息将被显示。

  2. 同样,缩小一个TIMESTAMP列不会导致信息失去,除了感觉上值在显示时,较少的信息被显示出。

  3. 尽管TIMESTAMP值被存储为完整精度,直接操作存储值的唯一函数是UNIX_TIMESTAMP();由于MySQL返回TIMESTAMP列的列值是进过格式化后的检索的值,这意味着你可能不能使用某些函数来操作TIMESTAMP列(例如HOUR()或SECOND()),除非TIMESTAMP值的相关部分被包含在格式化的值中。
    例如,一个TIMESTAMP列只有被定义为TIMESTAMP(10)以上时,TIMESTAMP列的HH部分才会被显示,因此在更短的TIMESTAMP值上使用HOUR()会产生一个不可预知的结果。

  4. 不合法TIMESTAMP值被变换到适当类型的“零”值(00000000000000)。(DATETIME,DATE亦然)

java可能遇到的坑

详情请看原文:原文链接:https://blog.csdn.net/m0_67698950/article/details/124781701
送 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参数time_zone=system时,查询timestamp字段会调用系统时区做时区转换,而由于系统时区存在全局锁问题,在多并发大数据量访问时会导致线程上下文频繁切换,CPU使用率暴涨,系统响应变慢设置假死。
建议将time_zone参数设置为system外的值,如中国地区服务器设置为’+8:00’;
建议将MySQL线下测试版本和线上生产版本保持一致。

Mysql-时间的存储 datetime还是时间戳timestamp?相关推荐

  1. mysql gettimestamp_使用mysql数据库,存储日期字段使用timestamp类型的时候,取出来的数据最后面会多一个.0 【解决方案】...

    mysql数据库,存储日期字段使用timestamp类型的时候,取出来的数据最后面会多一个.0 . 看似是YYYY-MM-DD HH:MM:SS,但其实应该是yyyy-MM-dd hh:mm:ss.f ...

  2. mysql 时间日期类型 datetime、timestamp、date、time、year

    MySQL中有多处表示日期的数据类型:YEAR.TIME.DATE.DTAETIME.TIMESTAMP.当只记录年信息的时候,可以只使用 YEAR 类型. 每一个类型都有合法的取值范围,当指定确定不 ...

  3. MySQL时间字段效率_MYSQL数据库时间字段INT,TIMESTAMP,DATETIME性能效率比较

    正 文: 在数据库设计的时候,我们经常会需要设计时间字段,在MYSQL中,时间字段可以使用int.timestamp.datetime三种类型来存储,那么这三种类型哪一种用来存储时间性能比较高,效率好 ...

  4. django mysql 时间_Python Django MySQL,时区、日期、时间戳(USE_TZ=True时的时间存储问题)...

    Python Django MySQL,时区.日期.时间戳,写下这个标题的时候,头脑里面回荡着火车上的经典广告词:啤酒.饮料.矿泉水,花生.瓜子.八宝粥.当然本文跟这些零食吃喝没有关系,我们主要来聊聊 ...

  5. mysql 中datetime_MySQL中Datetime与Timestamp

    "温故而知新" 真理永远都不过时,今天由于工作的事情涉及到了这里,印象中只记得DateTime类型占用8字节,TimeStamp类型占用4字节,心想这么久没有更新的知识万一过时了咋 ...

  6. MySQL中date、datetime、timestamp、time、year的区别

    前言 表示时间值的日期和时间类型为DATETIME.DATE.TIMESTAMP.TIME.YEAR. 每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示 ...

  7. 细说MySQL的时间戳(Timestamp)类型

    转载 生产环境中部署着各种版本的MySQL,包括MySQL 5.5/5.6/5.7三个大版本和N个小版本,由于MySQL在向上兼容性较差,导致相同SQL在不同版本上表现各异,下面从几个方面来详细介绍时 ...

  8. MySQL的时间戳(Timestamp)类型学习

    生产环境中部署着各种版本的MySQL,包括MySQL 5.5/5.6/5.7三个大版本和N个小版本.由于MySQL在向上兼容性较差,导致相同SQL在不同版本上表现各异,尤其是对于时间戳数据类型.下面从 ...

  9. mysql 时间 sql_MySQL sql语句获取当前日期|时间|时间戳

    1.1 获得当前日期+时间(date + time)函数:now() mysql> select now(); +-------+ | now() | +-------+ | 2013-04-0 ...

最新文章

  1. CentOS 7 安装Boost 1.67及boost_python
  2. rsyslog的学习
  3. 网站维护:利用iptables和ipset屏蔽恶意IP的访问
  4. 张家口市12320卫生热线呼叫中心预计今年初启动
  5. UE4 控制台管理器: 在C++中设置控制台变量
  6. Java并发编程-synchronized底层原理
  7. python rsa库_Python中rsa模块【sign 加签验签】的使用
  8. 数据库里的小知识❤️
  9. Linux搭建NFS文件服务器
  10. maters鸿蒙系统,Flutter入门进阶之旅(十)DialogToast
  11. ESS And 迅雷5 让我不能上网
  12. Android替换开机动画
  13. EPUB阅读工具-读者推荐
  14. 腾讯云数据库 TDSQL—— 私有云安装部署手册
  15. 计算机关机的DOS命令是,如何设置电脑自动关机dos指令
  16. 最佳机器学习公共数据集
  17. ubuntu-18.04 tenda U9安装wifi驱动
  18. html 浮动提示文本框,html浮动提示框功能如何实现 html浮动提示框功能实现代码...
  19. matlab 向量的定义方法
  20. 卷积神经网络之上采样-pytorch

热门文章

  1. 大毕业什么都没学到 就是收藏了超级实用的130个网站!!!
  2. python 添加半透明水印_怎么利用python给图片添加半透明水印
  3. transformer论文研读
  4. 如何将控制台程序发布为服务
  5. java 打印当月日历_74. Java打印当月日历
  6. 系统优化与lvs详解配置、haproxy
  7. swoole-redis连接池的问题总结
  8. DIY装机之显示器(苹果显示器参数)
  9. LeanStore论文分析
  10. 不同类型香港服务器怎么选?