今天测试发现公司某项目中设置用户出生日期的接口报错,查看日志发现是mysql用的timestamp存储birthday,而我设置的生日是1949年。这个数据在真实场景是正常的,那么问题就出在表字段的数据类型上了。
之前没有在意这些,今天发现了就记录一下。
大家在设计数据库的时候也不能无脑复制,需要根据业务设置最佳的数据类型和长度。
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列分配值。
支持的范围是'1000-01-01 00:00:00'到'9999-12-31 23:59:59'
。MySQL以’YYYY-MM-DD HH:MM:SS’格式显示DATETIME值,但允许使用字符串或数字为DATETIME列分配值。
范围是'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 是 MySQL 提供的两种比较相似的保存时间的数据类型。他们两者究竟该如何选择呢?
通常我们都会首选 Timestamp。 下面说一下为什么这样做!
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|+---------------------+---------------------+
查看当前会话时区 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’;
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 中有细微差别。
上一个:springboot整合XXL-JOB实行动态定时任务
下一个:vue的插槽