关于timestamp(0)的默认值问题

【 TiDB 使用环境】测试/
【 TiDB 版本】6.5.3
【复现路径】做过哪些操作出现的问题
【遇到的问题:问题现象及影响】
CREATE TABLE testdm.event (
db char(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT ‘’,
name char(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ‘’,
body longblob NOT NULL,
definer char(93) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT ‘’,
execute_at datetime(0) NULL DEFAULT NULL,
interval_value int(11) NULL DEFAULT NULL,
interval_field enum(‘YEAR’,‘QUARTER’,‘MONTH’,‘DAY’,‘HOUR’,‘MINUTE’,‘WEEK’,‘SECOND’,‘MICROSECOND’,‘YEAR_MONTH’,‘DAY_HOUR’,‘DAY_MINUTE’,‘DAY_SECOND’,‘HOUR_MINUTE’,‘HOUR_SECOND’,‘MINUTE_SECOND’,‘DAY_MICROSECOND’,‘HOUR_MICROSECOND’,‘MINUTE_MICROSECOND’,‘SECOND_MICROSECOND’) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
created timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE CURRENT_TIMESTAMP(0),
modified timestamp(0) NOT NULL DEFAULT ‘0000-00-00 00:00:00’,
last_executed datetime(0) NULL DEFAULT NULL,
starts datetime(0) NULL DEFAULT NULL,
ends datetime(0) NULL DEFAULT NULL,
status enum(‘ENABLED’,‘DISABLED’,‘SLAVESIDE_DISABLED’) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ‘ENABLED’,
on_completion enum(‘DROP’,‘PRESERVE’) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ‘DROP’,
sql_mode set(‘REAL_AS_FLOAT’,‘PIPES_AS_CONCAT’,‘ANSI_QUOTES’,‘IGNORE_SPACE’,‘NOT_USED’,‘ONLY_FULL_GROUP_BY’,‘NO_UNSIGNED_SUBTRACTION’,‘NO_DIR_IN_CREATE’,‘POSTGRESQL’,‘ORACLE’,‘MSSQL’,‘DB2’,‘MAXDB’,‘NO_KEY_OPTIONS’,‘NO_TABLE_OPTIONS’,‘NO_FIELD_OPTIONS’,‘MYSQL323’,‘MYSQL40’,‘ANSI’,‘NO_AUTO_VALUE_ON_ZERO’,‘NO_BACKSLASH_ESCAPES’,‘STRICT_TRANS_TABLES’,‘STRICT_ALL_TABLES’,‘NO_ZERO_IN_DATE’,‘NO_ZERO_DATE’,‘INVALID_DATES’,‘ERROR_FOR_DIVISION_BY_ZERO’,‘TRADITIONAL’,‘NO_AUTO_CREATE_USER’,‘HIGH_NOT_PRECEDENCE’,‘NO_ENGINE_SUBSTITUTION’,‘PAD_CHAR_TO_FULL_LENGTH’) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ‘’,
comment char(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT ‘’,
originator int(10) UNSIGNED NOT NULL,
time_zone char(64) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL DEFAULT ‘SYSTEM’,
character_set_client char(32) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
collation_connection char(32) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
db_collation char(32) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
body_utf8 longblob NULL,
PRIMARY KEY (db, name) USING BTREE
) ENGINE = MyISAM CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = ‘Events’ ROW_FORMAT = Dynamic
Result: 1067 - Invalid default value for 'modified

TIMESTAMP 类型包含日期和时间,支持的范围是 1970-01-01 00:00:01.000000 到 2038-01-19 03:14:07.999999。fsp参数表示秒精度,取值范围为 0~6,默认值为 0。在 TIMESTAMP 中,不允许零出现在月份部分或日期部分,唯一的例外是零值本身 ‘0000-00-00 00:00:00’。
看此文档写的是不允许在月份和日期部分为0,请问这是TIDB的规定还是TIMESTAMP 类型的?
原文链接:TIDB日期和时间类型-CSDN博客

还有这行的字符集和排序规则也过不去

mysql测试没问题,但是tidb应该是不能设置’0000-00-00 00:00:00’为TIMESTAMP(0)的默认值,改成这样可以
CREATE TABLE t202(id INT,modified TIMESTAMP(0) NOT NULL ,
time_zone CHAR(64) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL DEFAULT ‘SYSTEM’);

这个应该跟sql_mode有关,严格模式下是不可以插入0000的。

唯一的例外是零值本身 ‘0000-00-00 00:00:00’

那这句话该作何解释? :joy: :joy: :joy:

https://docs.pingcap.com/zh/tidb/stable/data-type-date-and-time#日期和时间类型

看原文的出处就了解了,在 TIMESTAMP 中,不允许零出现在月份部分或日期部分,唯一的例外是零值本身 0000-00-00 00:00:00

https://docs.pingcap.com/zh/tidb/stable/data-type-date-and-time#日期和时间类型

  • 如果 SQL 模式的 NO_ZERO_DATE 被禁用,TiDB 允许 DATEDATETIME 列中的月份或日期为零。例如,2009-00-002009-01-00。如果使用函数计算这种日期类型,例如使用 DATE_SUB()DATE_ADD() 函数,计算结果可能不正确。
  • 默认情况下,TiDB 启用 NO_ZERO_DATE SQL 模式。该模式可以避免存储像 0000-00-00 这样的零值。

不同类型的零值如下表所示:

数据类型 零值
DATE 0000-00-00
TIME 00:00:00
DATETIME 0000-00-00 00:00:00
TIMESTAMP 0000-00-00 00:00:00
YEAR 0000

如果 SQL 模式允许使用无效的 DATEDATETIMETIMESTAMP 值,无效值会自动转换为相应的零值(0000-00-000000-00-00 00:00:00

1 个赞

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