MYSQL存储时间数据的数据类型选择

2022年6月2日11:25:42

今天测试发现公司某项目中设置用户出生日期的接口报错,查看日志发现是mysql用的timestamp存储birthday,而我设置的生日是1949年。这个数据在真实场景是正常的,那么问题就出在表字段的数据类型上了。

之前没有在意这些,今天发现了就记录一下。

大家在设计数据库的时候也不能无脑复制,需要根据业务设置最佳的数据类型和长度

一、Mysql中用来存储日期的数据类型有三种:Date、Datetime、Timestamp。

1. Date数据类型:用来存储没有时间的日期。

Mysql获取和显示这个类型的格式为“YYYY-MM-DD”。按照标准的SQL,不允许其他格式。在UPDATE表达式以及SELECT语句的WHERE子句中应使用该格式。例如:mysql> SELECT * FROM tbl_nameWHERE date >= ‘2003-05-05’;

支持的范围为'1000-01-01'到'9999-12-31'。MySQL以’YYYY-MM-DD’格式显示DATE值,但允许使用字符串或数字为DATE列分配值。

2. Datetime类型:日期和时间的组合。

支持的范围是'1000-01-01 00:00:00'到'9999-12-31 23:59:59'。MySQL以’YYYY-MM-DD HH:MM:SS’格式显示DATETIME值,但允许使用字符串或数字为DATETIME列分配值。

3. Timestamp类型:时间戳。

范围是'1970-01-01 00:00:00'到'2037-12-31 23:59:59

TIMESTAMP列用于INSERT或UPDATE操作时记录日期和时间。如果你不分配一个值,表中的第一个TIMESTAMP列自动设置为最近操作的日期和时间。也可以通过分配一个NULL值,将TIMESTAMP列设置为当前的日期和时间。

TIMESTAMP值返回后显示为’YYYY-MM-DD HH:MM:SS’格式的字符串,显示宽度固定为19个字符。如果想要获得数字值,应在TIMESTAMP 列添加+0。

所有不符合上面所述格式的数据都会被转换为相应类型的0值。(0000-00-00或者0000-00-00 00:00:00)

二、Datetime 和 Timestamp 之间抉择

Datetime 和 Timestamp 是 MySQL 提供的两种比较相似的保存时间的数据类型。他们两者究竟该如何选择呢?

通常我们都会首选 Timestamp。 下面说一下为什么这样做!

1. DateTime 类型没有时区信息

DateTime 类型是没有时区信息的(时区无关) ,DateTime 类型保存的时间都是当前会话所设置的时区对应的时间。这样就会有什么问题呢?当你的时区更换之后,比如你的服务器更换地址或者更换客户端连接时区设置的话,就会导致你从数据库中读出的时间错误。不要小看这个问题,很多系统就是因为这个问题闹出了很多笑话。

Timestamp 和时区有关。Timestamp 类型字段的值会随着服务器时区的变化而变化,自动换算成相应的时间,说简单点就是在不同时区,查询到同一个条记录此字段的值会不一样。

下面实际演示一下!

建表 SQL 语句:

CREATE TABLE `time_zone_test`(
  `id`bigint(20) NOT NULL AUTO_INCREMENT,
  `date_time` datetime DEFAULT NULL,
  `time_stamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY(`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;

插入数据:

INSERT INTOtime_zone_test(date_time,time_stamp)VALUES(NOW(),NOW());

查看数据:

select date_time,time_stamp from time_zone_test;

结果:

+---------------------+---------------------+| date_time| time_stamp|+---------------------+---------------------+|2020-01-1109:53:32|2020-01-1109:53:32|+---------------------+---------------------+

修改当前会话的时区:

set time_zone='+8:00';

再次查看数据:

+---------------------+---------------------+| date_time| time_stamp|+---------------------+---------------------+|2020-01-1109:53:32|2020-01-1117:53:32|+---------------------+---------------------+

扩展:一些关于 MySQL 时区设置的一个常用 sql 命令

查看当前会话时区 SELECT @@session.time_zone;
设置当前会话时区 SET time_zone = ‘Europe/Helsinki’; SET time_zone = “+00:00”;
数据库全局时区设置 SELECT @@global.time_zone;
设置全局时区 SET GLOBAL time_zone = ‘+8:00’; SET GLOBAL time_zone = ‘Europe/Helsinki’;

2. DateTime 类型耗费空间更大

Timestamp 只需要使用 4 个字节的存储空间,但是 DateTime 需要耗费 8 个字节的存储空间。但是,这样同样造成了一个问题,Timestamp 表示的时间范围更小。

DateTime :1000-01-01 00:00:00 ~ 9999-12-31 23:59:59
Timestamp:1970-01-01 00:00:01 ~ 2037-12-31 23:59:59

Timestamp 在不同版本的 MySQL 中有细微差别。

  • 作者:不负好时光⁡⁢
  • 原文链接:https://blog.csdn.net/chengsw1993/article/details/116597420
    更新时间:2022年6月2日11:25:42 ,共 2515 字。