timestamp 类型行为和 mysql 不一致

【TiDB 版本】v7.5.3
【遇到的问题:问题现象及影响】
表结构:
CREATE TABLE t1 (
pkid int(20) NOT NULL AUTO_INCREMENT,
ts timestamp(3) NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT ‘时间戳’,
ts2 timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT ‘时间戳’,
PRIMARY KEY (pkid)
) ENGINE=InnoDB AUTO_INCREMENT=90004 DEFAULT CHARSET=utf8mb4;

DML:
set sql_mode=‘’;
insert into t1 values (null,null,null);

TiDB 返回结果:

MySQL 返回结果:

INSERT INTO t_timestamp(ts) VALUES (NULL);
这样插没问题,应该是
INSERT INTO t_timestamp VALUES (NULL,NULL,NULL);
这样插的时候,tidb把null直接转换成0000-00-00 00:00:00.000了

1 个赞

在Mysql中, 如果一个 NOT NULL TIMESTAMP 字段被插入 NULL ,并且该字段有 DEFAULT CURRENT_TIMESTAMP ,则会自动使用默认值填充。

mysql 8.0.42版本。报错插不进去。

tidb 8.5.2版本,错误是一样的。

tidb 7.5.3我也测了下,确实和mysql8不一致。插入是成功的。

7.5.6就变得一致了。

这个兼容性问题,应该确实存在,不过后续应该是修复了。

2 个赞

是否插入进去这个问题,原因应该是这个:
explicit_defaults_for_timestamp 参数的默认值,MySQL 5.7 是 OFF,MySQL 8.0 是 ON

1 个赞

你发的这个sql是可以。
不过业务用了 orm,默认情况下字段是完整的,不传值的时候指定为 null

:thinking:也就是TiDB在兼容8.0的时候,把这个参数也兼容了,这样理解是对的吧。

此话题已在最后回复的 7 天后被自动关闭。不再允许新回复。