[mysql] ‘create_time‘ 时间戳默认当前时间后值为null问题

一、问题

`create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP

数据库表定义把时间字段的默认值设置为当前时间戳(CURRENT_TIMESTAMP),添加完其他非空字段,执行后数据库表create_time列一直为<null>.

二、未解决问题的尝试

1、把数据库"create_time"列设置未NOT NULL

结果:

报错
Column 'create_time' cannot be null

2、后端显式设置

 user.setCreate_time(new Date());
 System.out.println(user.getCreate_time());

结果:

报错:
java.sql.SQLSyntaxErrorException: Column 'create_time' specified twice

三、最后成果解决办法

在MySQL的my.ini配置文件中[mysqld]下添加

explicit_defaults_for_timestamp=OFF

如图:

重新启动MySQL

管理员身份运行cmd
net stop mysql
net start mysql

可正常插入create_time.

四、原因

explicit_defaults_for_timestamp是 MySQL 中的一个系统变量,用于控制 TIMESTAMP 列的默认行为。

当该参数设置为ON时:

  1. 如果timestamp列没有显式的指定not null属性,那么默认的该列可以为null,此时向该列中插入null值时,会直接记录null,而不是current timestamp。
  2. 不会自动的为表中的第一个timestamp列加上DEFAULT CURRENT_TIMESTAMP 和ON UPDATE CURRENT_TIMESTAMP属性。
  3. 如果timestamp列被加上了not null属性,并且没有指定默认值。这时如果向表中插入记录,但是没有给该TIMESTAMP列指定值的时候,如果strict sql_mode被指定了,那么会直接报错。
  4. 如果strict sql_mode没有被指定,那么会向该列中插入’0000-00-00 00:00:00’并且产生一个warning。

当该参数默认设置为OFF时:

  1. 如果timestamp列没有显式的指明null属性,那么该列会被自动加上not null属性(而其他类型的列如果没有被显式的指定not null,那么是允许null值的),如果往这个列中插入null值,会自动的设置该列的值为current timestamp值。
  2. 表中的第一个timestamp列,如果没有指定null属性或者没有指定默认值,也没有指定ON UPDATE语句。那么该列会自动被加上DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP属性。
  3. 对于其它TIMESTAMP列,如果没有显示指定NULL和DEFAULT属性的话,会自动设置为NOT NULL DEFAULT ‘0000-00-00 00:00:00’。