mysql timestamp字段规范使用详情
怎么入门数据库编程?需要学习哪些知识点?这是新手们刚接触编程时常见的问题;下面golang学习网就来给大家整理分享一些知识点,希望能够给初学者一些帮助。本篇文章就来介绍《mysql timestamp字段规范使用详情》,涉及到字段、mysqltimestamp,有需要的可以收藏一下
1. 前言
这个世界离不开时间,同样,数据库中也是如此,表中的每条记录除了数据模型的时间字段(如生日,生产日期,出发日期等),一般至少还有两个固定的时间字段:记录插入时间,记录更新时间。
然而,看似很简单时间字段,谁能想到会导致应用报错,引发血案:

个中缘由,正是接下来要讲到的。
2. mysql中的时间字段
因时间字段的一些特性与版本有关,且目前我司统一使用的mysql 5.7版本,因此本文内容都基于mysql 5.7。
mysql时间相关的字段主要有DATE、DATETIME、TIMESTAMP。

其中datatime和timestamp字段都可以包含小数,如datetime(6),字节长度的可变部分(0-3)由小数位数决定:

2.1. 数据的存储方式
DATE:
3个字节的整型,按照这种方式进行压缩: YYYY×16×32 + MM×32 + DD
DATETIME:
整数部分5个字节,由以下部分组成

TIMESTAMP:
整数部分4个字节,存储从(‘1970-01-01 00:00:00’ UTC)到指定时间的秒数;
timestamp类型是4个字节,最大值是2的31次方减1,也就是2147483647,转换成北京时间就是2038-01-19 11:14:07
2.2. DATETIME和TIMESTMAP的区别
- 数据的存储方式决定了timestamp的计算和索引效率比datetime更快;
- timestamp存储的时间范围比datetime小很多;
- timestamp数据显示时要根据时区换算,datetime数据显示时不受时区影响;
admin@test 04:42:41>show variables like 'time_zone'; +---------------+--------+ | Variable_name | Value | +---------------+--------+ | time_zone | +08:00 | +---------------+--------+ admin@test 04:42:42>create table t1(dt datetime,ts timestamp); admin@test 04:43:07>insert into t1 values(now(),now()); admin@test 04:43:17>select * from t1; +---------------------+---------------------+ | dt | ts | +---------------------+---------------------+ | 2021-03-27 16:43:17 | 2021-03-27 16:43:17 | +---------------------+---------------------+ admin@test 04:43:50>set time_zone='+09:00'; admin@test 04:44:00>select * from t1; +---------------------+---------------------+ | dt | ts | +---------------------+---------------------+ | 2021-03-27 16:43:17 | 2021-03-27 17:43:17 | +---------------------+---------------------+ admin@test 04:44:07>
timestamp在处理默认值和null值时的行为时受mysql参数explicit_defaults_for_timestamp控制,datatime不受影响。
3. timestamp字段处理默认值和null值时的行为
3.1. 参数禁用
当禁用该值时(explicit_defaults_for_timestamp=0),mysql启用timestamp字段的特有行为(和数字、字符串等类型的表现不同),
具体特性如下:
- timestamp字段默认设置为not null
- 表中的第一个timestamp字段插入时默认设置当前时间,更新时,默认更新为当前时间,即默认设置为以下特性:NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
- 表中的第二个timestamp字段默认为'0000-00-00 00:00:00'
- 显式向timestamp字段插入null值时,不会报错,且都设置为当前时间;
- 对datetime字段的行为无影响。
admin@test 05:49:00>create table t2(id int auto_increment, name varchar(100), dt1 datetime, ts1 timestamp, ts2 timestamp, primary key(id)); admin@test 05:49:48>show create table t2; ±------±--------------------------------------------------------------------------+ | Table | Create Table | ±------±--------------------------------------------------------------------------+ | t2 | CREATE TABLE t2 ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(100) DEFAULT NULL, dt1 datetime DEFAULT NULL, ts1 timestamp NULL DEFAULT NULL, ts2 timestamp NULL DEFAULT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 | ±------±--------------------------------------------------------------------------+ 1 row in set (0.00 sec) admin@test 05:50:20>insert into t2(name) values(‘a1'); Query OK, 1 row affected (0.00 sec) admin@test 05:51:07>select * from t2; ±—±-----±-----±-----±-----+ | id | name | dt1 | ts1 | ts2 | ±—±-----±-----±-----±-----+ | 1 | a1 | NULL | NULL | NULL | ±—±-----±-----±-----±-----+ 1 row in set (0.00 sec) ##注:插入记录时,默认为null admin@test 05:54:20>update t2 set name=‘aa1' where id=1; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 admin@test 05:54:31>select * from t2; ±—±-----±-----±-----±-----+ | id | name | dt1 | ts1 | ts2 | ±—±-----±-----±-----±-----+ | 1 | aa1 | NULL | NULL | NULL | ±—±-----±-----±-----±-----+ 1 row in set (0.00 sec) ##注:更新记录时,默认为null admin@test 05:58:10>create table t3(id int auto_increment,name varchar(100),ts1 timestamp not null default current_timestamp,primary key(id)); admin@test 05:58:18>insert into t3(name) values(‘a1'); Query OK, 1 row affected (0.00 sec) admin@test 05:58:22>select * from t3; ±—±-----±--------------------+ | id | name | ts1 | ±—±-----±--------------------+ | 1 | a1 | 2021-03-23 17:58:22 | ±—±-----±--------------------+ 1 row in set (0.00 sec) ##注:创建表手动设置not null default current_timestamp,插入记录不含timestamp字段时,默认为当前时间 admin@test 05:58:25>insert into t3(name,ts1) values(‘a1',null); ERROR 1048 (23000): Column ‘ts1' cannot be null ##注:timestamp字段显式插入null时,报错Column ‘ts1' cannot be null admin@test 05:59:11>create table t4(id int auto_increment,name varchar(100),ts1 timestamp not null ,primary key(id)); Query OK, 0 rows affected (0.04 sec) admin@test 05:59:44>insert into t4(name) values(‘a1'); ERROR 1364 (HY000): Field ‘ts1' doesn't have a default value admin@test 05:59:49> ##注:创建表手动设置not null,插入记录不含timestamp字段时,报错Field doesn't have a default value admin@test 05:59:50>insert into t4(name,ts1) values(‘a1',null); ERROR 1048 (23000): Column ‘ts1' cannot be null admin@test 05:59:57> ##注:timestamp字段显式插入null时,报错Column ‘ts1' cannot be null
3.2. 参数启用
当启用该值时(explicit_defaults_for_timestamp=1),mysql禁用timestamp字段的特有行为,具体表现和数字、字符串类型一样。
- timestamp字段默认属性是“NULL DEFAULT NULL”;
- timestamp字段手动设置了not null和default后,显式插入null值会报错:Column cannot be null;
- timestamp字段同时设置了not null但未设置default后,显式插入null值会报错:Column cannot be null,插入记录不含timestamp字段时会报错Field doesn’t have a default value;
- 对datetime字段的行为无影响。
admin@test 05:49:00>create table t2(id int auto_increment, name varchar(100), dt1 datetime, ts1 timestamp, ts2 timestamp, primary key(id));
admin@test 05:49:48>show create table t2;
+-------+---------------------------------------------------------------------------+
| Table | Create Table |
+-------+---------------------------------------------------------------------------+
| t2 | CREATE TABLE `t2` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(100) DEFAULT NULL,
`dt1` datetime DEFAULT NULL,
`ts1` timestamp NULL DEFAULT NULL,
`ts2` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 |
+-------+---------------------------------------------------------------------------+
1 row in set (0.00 sec)
admin@test 05:50:20>insert into t2(name) values(‘a1');
Query OK, 1 row affected (0.00 sec)
admin@test 05:51:07>select * from t2;
±—±-----±-----±-----±-----+
| id | name | dt1 | ts1 | ts2 |
±—±-----±-----±-----±-----+
| 1 | a1 | NULL | NULL | NULL |
±—±-----±-----±-----±-----+
1 row in set (0.00 sec)
## 注:插入记录时,默认为null
admin@test 05:54:20>update t2 set name=‘aa1' where id=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
admin@test 05:54:31>select * from t2;
±—±-----±-----±-----±-----+
| id | name | dt1 | ts1 | ts2 |
±—±-----±-----±-----±-----+
| 1 | aa1 | NULL | NULL | NULL |
±—±-----±-----±-----±-----+
1 row in set (0.00 sec)
## 注:更新记录时,默认为null
admin@test 05:58:10>create table t3(id int auto_increment,name varchar(100),ts1 timestamp not null default current_timestamp,primary key(id));
admin@test 05:58:18>insert into t3(name) values(‘a1');
Query OK, 1 row affected (0.00 sec)
admin@test 05:58:22>select * from t3;
±—±-----±--------------------+
| id | name | ts1 |
±—±-----±--------------------+
| 1 | a1 | 2021-03-23 17:58:22 |
±—±-----±--------------------+
1 row in set (0.00 sec)
##注:创建表手动设置not null default current_timestamp,插入记录不含timestamp字段时,默认为当前时间
admin@test 05:58:25>insert into t3(name,ts1) values(‘a1',null);
ERROR 1048 (23000): Column ‘ts1' cannot be null
##注:timestamp字段显式插入null时,报错Column ‘ts1' cannot be null
admin@test 05:59:11>create table t4(id int auto_increment,name varchar(100),ts1 timestamp not null ,primary key(id));
Query OK, 0 rows affected (0.04 sec)
admin@test 05:59:44>insert into t4(name) values(‘a1');
ERROR 1364 (HY000): Field ‘ts1' doesn't have a default value
admin@test 05:59:49>
##注:创建表手动设置not null,插入记录不含timestamp字段时,报错Field doesn't have a default value
admin@test 05:59:50>insert into t4(name,ts1) values(‘a1',null);
ERROR 1048 (23000): Column ‘ts1' cannot be null
admin@test 05:59:57>
##注:timestamp字段显式插入null时,报错Column ‘ts1' cannot be null
4. 总结
启用该参数(explicit_defaults_for_timestamp=1)
timestamp字段在null、default属性的表现和其他普通字段表现类似:
- 如果没有显式设置default值,该值的维护完全需要应用程序显式插入和更新;
- 如果设置了not null,那么一定不能显式插入null值,否则应用会报错。
禁用该参数(explicit_defaults_for_timestamp=0)
timestamp字段在null、default属性的表现和其他普通字段表现有明显差异:
- 默认会设置NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
- 显式插入null值,默认为当前时间,应用不会报错。
案例发生的场景:
公司所有集群已经统一启用该参数;
某集群过去某个时间因为研发的要求,将该参数禁用,但是这次集群切换后的新服务器采用了统一的参数模板,启用了参数;
应用程序显式向timestamp字段插入null值,且该字段已经设置了not null,在禁用该参数的集群不会报错,但是切换到启用了该参数的集群时,就报column cannot be null.
统一规范:
个别集群禁用该参数导致公司所有的mysql集群参数不统一,可能带来应用报错的后果,因此建议:
- 统一公司所有集群的参数explicit_defaults_for_timestamp=1;
- 用timestamp字段时设置default和not null属性;
- 应用程序不要显式插入null值。
到这里,我们也就讲完了《mysql timestamp字段规范使用详情》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于mysql的知识点!
MySQL执行计划详解
- 上一篇
- MySQL执行计划详解
- 下一篇
- Mysql系统变量与状态变量详细介绍
-
- 数据库 · MySQL | 1天前 |
- MySQL数值函数大全及使用技巧
- 117浏览 收藏
-
- 数据库 · MySQL | 2天前 |
- 三种登录MySQL方法详解
- 411浏览 收藏
-
- 数据库 · MySQL | 3天前 |
- MySQL数据备份方法与工具推荐
- 420浏览 收藏
-
- 数据库 · MySQL | 3天前 |
- MySQL数据备份方法与工具推荐
- 264浏览 收藏
-
- 数据库 · MySQL | 4天前 |
- MySQL索引的作用是什么?
- 266浏览 收藏
-
- 数据库 · MySQL | 5天前 |
- MySQL排序原理与实战应用
- 392浏览 收藏
-
- 数据库 · MySQL | 1星期前 |
- MySQLwhere条件查询技巧
- 333浏览 收藏
-
- 数据库 · MySQL | 1星期前 |
- MySQL常用数据类型有哪些?怎么选更合适?
- 234浏览 收藏
-
- 数据库 · MySQL | 1星期前 |
- MySQL常用命令大全管理员必学30条
- 448浏览 收藏
-
- 数据库 · MySQL | 1星期前 |
- MySQL高效批量插入数据方法大全
- 416浏览 收藏
-
- 数据库 · MySQL | 1星期前 |
- MySQL性能优化技巧大全
- 225浏览 收藏
-
- 数据库 · MySQL | 1星期前 |
- MySQL数据备份4种方法保障安全
- 145浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- ChatExcel酷表
- ChatExcel酷表是由北京大学团队打造的Excel聊天机器人,用自然语言操控表格,简化数据处理,告别繁琐操作,提升工作效率!适用于学生、上班族及政府人员。
- 3164次使用
-
- Any绘本
- 探索Any绘本(anypicturebook.com/zh),一款开源免费的AI绘本创作工具,基于Google Gemini与Flux AI模型,让您轻松创作个性化绘本。适用于家庭、教育、创作等多种场景,零门槛,高自由度,技术透明,本地可控。
- 3376次使用
-
- 可赞AI
- 可赞AI,AI驱动的办公可视化智能工具,助您轻松实现文本与可视化元素高效转化。无论是智能文档生成、多格式文本解析,还是一键生成专业图表、脑图、知识卡片,可赞AI都能让信息处理更清晰高效。覆盖数据汇报、会议纪要、内容营销等全场景,大幅提升办公效率,降低专业门槛,是您提升工作效率的得力助手。
- 3405次使用
-
- 星月写作
- 星月写作是国内首款聚焦中文网络小说创作的AI辅助工具,解决网文作者从构思到变现的全流程痛点。AI扫榜、专属模板、全链路适配,助力新人快速上手,资深作者效率倍增。
- 4509次使用
-
- MagicLight
- MagicLight.ai是全球首款叙事驱动型AI动画视频创作平台,专注于解决从故事想法到完整动画的全流程痛点。它通过自研AI模型,保障角色、风格、场景高度一致性,让零动画经验者也能高效产出专业级叙事内容。广泛适用于独立创作者、动画工作室、教育机构及企业营销,助您轻松实现创意落地与商业化。
- 3785次使用
-
- golang中按照结构体的某个字段排序实例代码
- 2022-12-24 317浏览
-
- 对Golang中的FORM相关字段理解
- 2022-12-27 298浏览
-
- golang 实现两个结构体复制字段
- 2023-01-14 271浏览
-
- gorm update传入struct对象,零值字段不更新的解决方案
- 2023-01-07 341浏览
-
- 详解MySQL中数据类型和字段类型
- 2023-02-23 311浏览

