1. CREATE TABLE `t2` (
  2. `m_time` time DEFAULT NULL,
  3. `m_date` date DEFAULT NULL,
  4. `m_datetime` datetime DEFAULT NULL,
  5. `m_timestamp` timestamp NULL DEFAULT NULL,
  6. `m_year` year DEFAULT NULL
  7. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

针对非法值的插入,MySQL是否报错取决于SQL是否开启了严格模式。 关闭严格模式:**set session sql_mode='NO_ENGINE_SUBSTITUTION';**

一、Year

1.1 支持范围:1901~2155 。

1901那年清政府签订了《辛丑条约》

在 MySQL5.7.5 中删除了对Year(2)的支持,同一转换为Year(4)。所以如果你使用这个版本的MySQL,会发现它会把年份以4位长度的数字展示给我们看。

1.2 开启严格模式

可以尝试插入一个超过它规定范围的值 ,会发现MySQL报错了,如下:
image.png

二、Date

2.1 支持的范围:1000-01-01 ~ 9999-12-31

2.2 开启严格模式

mysql.png


三、Datetime

3.1 支持的范围:1000-01-01 00:00:00.000000 ~ 9999-12-31 23:59:59.999999

很明显,Datetime比Date更精确。

3.2 开启严格模式

image.png

四、Time

4.1 支持的范围:-838:59:59.000000 to 838:59:59.000000

time类型不仅可以用来表示24h,还可以用来表示一个时间范围,这个时间范围可能会很大,甚至是负的。
image.png
image.png

4.2 开启严格模式

image.png
image.png

秒数是满60进1的。所以插入60时,在jdbc层面会爆出下面的错误:format exception

image.png

五、Timestamp

5.1 支持范围: 1970-01-01 00:00:01 UTC to 2038-01-19 03:14:07 UTC

因为32位能表示的最大值是2147483647。另外1年365天的总秒数是 31536000,2147483647/31536000 = 68.1,也就是说32位能表示的最长时间是68年,从1970年开始的话,加上68.1,实际最终到2038年01月19日03时14分07秒。

过了这个上线,所有32位操作系统时间都会变成10000000 00000000 00000000 00000000

这个问题在64位操作系统中已经不复存在

image.png

5.2 Timestamp格式:

列类型 显示格式
TIMESTAMP(14) YYYYMMDDHHMMSS
TIMESTAMP(12) YYMMDDHHMMSS
TIMESTAMP(10) YYMMDDHHMM
TIMESTAMP(8) YYYYMMDD
TIMESTAMP(6) YYMMDD
TIMESTAMP(4) YYMM
TIMESTAMP(2) YY

六、默认值

在创建表的时候,可以为时间列选定一个默认值。

DEFAULT CURRENT_TIMESTAMP:表示当插入数据的时候,该字段默认值为当前时间
ON UPDATE CURRENT_TIMESTAMP:表示每次更新这条数据的时候,该字段都会更新成当前时间

这两个操作是mysql数据库本身在维护,所以可以根据这个特性来生成【创建时间】和【更新时间】两个字段,且不需要代码来维护。如下:

CREATE TABLE `mytest` (
    `text` varchar(255) DEFAULT '' COMMENT '内容',
    `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;