总结背景: 对于MYSQL数据库日期类型或多有了解, 但并很清晰其中一些规则. 基本都是面向浏览器编码, 这实质上也是一种方式.  但期间遇到两个问题:

  • 时常遇到建表中出现多个datetime或者timestamp字段并使用 DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP时报错, 难以查到原因, 最后粗暴的直接去掉
  • 查询网络非官方文档知识点不全, 越查越糊涂

因为这两点 促使我硬着头皮查看MYSQL的官方文档 虽然刚开始很难受 结果的确收获颇多. 以下是我的一点总结:

1、类型简介

2、Automatic Initialization and Updating for TIMESTAMP and DATETIME

3、总结

1、类型简介

1.1、存储使用的长度

MySQL 5.6.4版本之后允许TIME、TIMESTAMP、DATETIME类型具有[0-6]位小数部分(Fractional Seconds in Time Values),  因而存储使用长度为变化的

Data Type Storage Required Before MySQL 5.6.4 Storage Required as of MySQL 5.6.4
YEAR 1 byte 1 byte
DATE 3 bytes 3 bytes
TIME 3 bytes 3 bytes + fractional seconds storage
DATETIME 8 bytes 5 bytes + fractional seconds storage
TIMESTAMP 4 bytes 4 bytes + fractional seconds storage

例如 time类型使用3 bytes存储, 加上小数部分长度. 而需要多少长度,取决于小数的长度:

Fractional Seconds Precision Storage Required
0 0 bytes
1, 2 1 byte
3, 4 2 bytes
5, 6 3 bytes

例如 , TIME(0)TIME(2)TIME(4), and TIME(6) 分别总共使用 3, 4, 5, and 6 bytes . TIME and TIME(0) 实质是一样的, 都需要3 bytes进行存储 .

1.2、字段声明和表示范围

由于MYSQL官方文档已经很清晰 直接附上原始文档 Date and Time Type Overview 这里只分析需要注意的点:

  • DATE 表示范围在'1000-01-01' to '9999-12-31' 存储格式为'yyyy-mm-dd',也可能出现年使用 two-digit表示 例如: 12-01-01 MYSQL解释规则为: 00-69解释为2000-2069 70-99解释为1970-1999
  • TIMESTAMP表示范围在'1970-01-01 00:00:01.000000' UTC to '2038-01-19 03:14:07.999999' UTC , 而MySQL将TIMESTAMP值从当前时区转换为UTC以进行存储,并从UTC转换回当前时区以进行检索。如果期间时区发生的变化, 例如存储之后修改时区Section 5.1.12, “MySQL Server Time Zone Support. 那么取出来和之前存入的数据将不一致.
  • DATETIME表示范围为'1000-01-01 00:00:00' to '9999-12-31 23:59:59' 无时区.
  • 如果strict mode禁用 , 非法 DATEDATETIME, or TIMESTAMP 的时间会被转换为“零值” 根据类型转换为'0000-00-00' or '0000-00-00 00:00:00', 否则直接会报错
  • YEAR存在历史问题 YEAR(4) 和 YEAR(2)(YEAR(2) Limitations and Migrating to YEAR(4)). YEAR(2)在MySQL 5.6.6之后已标注过时,使用YEAR(2)会被强制转换为YEAR(4)并产生warnings.
  • YEAR允许使用 YY format 和 字符串('0'-'99', '0'-'69'表示20002069' '70'-'99'表示1970-1999)、数字(1-99, 1-69表示2001-2069 70-99表示1970-1999)进行赋值. 

2、Automatic Initialization and Updating for TIMESTAMP and DATETIME(自动初始化 和 自动更新)

由于文章写的比较详细, 这里不再赘述, 给出原文链接 Automatic Initialization and Updating for TIMESTAMP and DATETIME 和 explicit_defaults_for_timestamp

3、总结

知识还是需要系统性的了解, 即使记不住也没关系. 下次再去查询文档资料的时候会更有针对性.  而对于大多权威的技术文章都是英文 需要耐心下来阅读 一定有所收获.

主要参考链接: Date and Time Types

MYSQL时间类别总结: TIMESTAMP、DATETIME、DATE、TIME、YEAR的更多相关文章

  1. MySQL时间设计 int timestamp datatime 查询效率性能比较

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

  2. mysql中的时间类型datetime,date,time,year,timestamp小知识点

    1.datetime,date,time,year四个类型的值,可以手动输入,也可以调用函数获得值 ① 手动输入,格式如下: datetime "2016-6-22 14:09:30&quo ...

  3. 关于datetime,date,timestamp,year,time时间类型小结

    关于datetime,date,timestamp,year,time时间类型 datetime占用8个字节 日期范围:”1000-01-01 00:00:00” 到”9999-12-31 23:59 ...

  4. mysql 时间类型datetime与timestamp区别比较

    mysql 时间类型datetime与timestamp区别比较 相同点: 显示宽度和格式相同,显示宽度固定在19字符,格式为YYYY-MM-DD HH:MM:SS. 不同点: (1)时间范围不同: ...

  5. MySQL时间类型datetime、bigint及timestamp的查询效率

    前期数据准备 通过程序往数据库插入 50w 数据 数据表: CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `time_dat ...

  6. mysql中timestamp,datetime,int类型的区别与优劣

    转载请注明来自 souldak,微博: @evagle 以下内容 整合筛选自互联网: int 1. 占用4个字节 2. 建立索引之后,查询速度快 3. 条件范围搜索可以使用使用between 4. 不 ...

  7. mysql date and time type ---- mysql 时间&日期 类型详解

    mysql 中支持用多种方式来表示时间与日期 一.mysql 中能表示时间与日期的数据类型: 1.表示年 ) -- 最好不要用这个数据类型.对于年份的取值中有[1901 --> 2155] + ...

  8. 【转载】mysql中timestamp,datetime,int类型的区别与优劣

    转载来自souldak,微博:@evagle以下内容整合筛选自互联网: int1. 占用4个字节2. 建立索引之后,查询速度快3. 条件范围搜索可以使用使用between4. 不能使用mysql提供的 ...

  9. Java获取当前时间及String、datetime、date相互转化

    一.获取当前系统时间和日期并格式化输出: import java.util.Date; import java.text.SimpleDateFormat; public class NowStrin ...

随机推荐

  1. 转载:2.2.1 块配置项《深入理解Nginx》(陶辉)

    原文:https://book.2cto.com/201304/19626.html 块配置项由一个块配置项名和一对大括号组成.具体示例如下:events {-} http { upstream ba ...

  2. Android系统信息(内存、cpu、sd卡、电量、版本)获取

    Android系统信息(内存.cpu.sd卡.电量.版本)获取 /*APPInfo.java*/ public class AppInfo { private String appLable; pri ...

  3. 解决sdk更新时候报错 http://dl-ssl.google.com/android上不去,链接拒绝

    解决国内访问Google服务器的困难: 启动 Android SDK Manager : 打开主界面,依次选择「Tools」.「Options...」,弹出『Android SDK Manager - ...

  4. OCM_第十七天课程:Section7 —》GI 及 ASM 安装配置 _管理和配置 GRID /实施 ASM 故障组 /创建 ACFS 文件系统

    注:本文为原著(其内容来自 腾科教育培训课堂).阅读本文注意事项如下: 1:所有文章的转载请标注本文出处. 2:本文非本人不得用于商业用途.违者将承当相应法律责任. 3:该系列文章目录列表: 一:&l ...

  5. ValueError: total size of new array must be unchanged

    在对数据增强后的faster rcnn中进行训练时,出现这个错误,原因是在lib/roi_data_layer/layer.py中,会出现 inds = np.reshape(inds, (-1,2) ...

  6. LeetCode(41):缺失的第一个正数

    Hard! 题目描述: 给定一个未排序的整数数组,找出其中没有出现的最小的正整数. 示例 1: 输入: [1,2,0] 输出: 3 示例 2: 输入: [3,4,-1,1] 输出: 2 示例 3: 输 ...

  7. eclipse无法添加tomcat

    问题如图所示 就是选择对应的版本无法选择硬盘里面的tomcat文件 关闭Eclipse 删除WorkSpace目录下/.metadata/.plugins/org.eclipse.core.runti ...

  8. 【Java】 剑指offer(68) 树中两个结点的最低公共祖先

      本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入两个树结点,求它们的最低公共祖先. 思路 该题首先要和面试 ...

  9. HDU 1358 Period (kmp求循环节)(经典)

    <题目链接> 题目大意: 意思是,从第1个字母到第2字母组成的字符串可由某一周期性的字串(“a”) 的两次组成,也就是aa有两个a组成: 第三行自然就是aabaab可有两个aab组成: 第 ...

  10. idea springboot热部署无效问题

    Intellij IDEA 使用Spring-boot-devTools无效解决办法 springboot项目中遇到的bug <dependencies> <!--spring bo ...