Tidb设置NO_ZERO_IN_DATE无效

为提高效率,请提供以下信息,问题描述清晰能够更快得到解决:

【TiDB 版本】
v5.0.0
【问题描述】
建表语句如下

CREATE TABLE `abc` (
	`id` INT ( 20 ) NOT NULL AUTO_INCREMENT COMMENT '自增长主键',
	`create_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '创建时间',
	`update_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '修改时间',
	`expire_time` datetime NOT NULL DEFAULT '2999-00-00 00:00:00' COMMENT '过期时间',
	PRIMARY KEY ( `id` )
)   DEFAULT CHARSET = utf8 

结果会报错Error 1067: Invalid default value for ‘expire_time’。
查询相关帖子,发现应该是NO_ZERO_IN_DATE和NO_ZERO_DATE的限制问题

使用如下语句修改日期相关设置,去掉了以上2个限制

SET GLOBAL sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'

==========================================
结果发现NO_ZERO_DATE生效了,我create_time的0000-00-00 00:00:00不报错。
但是NO_ZERO_IN_DATE似乎没生效,expire_time的2999-00-00 00:00:00依旧报错。

请问是bug吗,如何解决?

  1. 请问创建集群时有打开new 字符集吗?
  2. 麻烦 show create table 的结果,多谢。

问题1是看哪个配置?

问题2 create table的关键字段就是上面代码贴的CREATE TABLE abc

show create table 的结果反馈下,多谢。

上游mysql真实表show create table如下:

CREATE TABLE `short_url` (
  `id` int(20) NOT NULL AUTO_INCREMENT COMMENT '自增长主键',
  `short_code` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT '短链接编码',
  `long_url` varchar(500) NOT NULL DEFAULT '' COMMENT '原始链接地址',
  `create_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '创建时间',
  `update_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '修改时间',
  `expire_time` datetime NOT NULL DEFAULT '2999-00-00 00:00:00' COMMENT '过期时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uniq_index_short_code` (`short_code`)
) ENGINE=InnoDB AUTO_INCREMENT=1974805 DEFAULT CHARSET=utf8 COMMENT='短链接和原始链接对应表'

已确认是 bug。除了更改默认值以外,暂时没有解决办法,这个问题将在 5.0.2 修复。

相关 issue:https://github.com/pingcap/tidb/issues/24165

好的,明白了

目前workaround是把上游相关表,全部都把月和日改成非0…

1 个赞

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