从MySQL 8.0开始,MySQL官方将explicit_defaults_for_timestamp的默认值从OFF修改成ON。目前PolarDB MySQL版 8.0中该参数的默认值仍然遵循5.6和5.7版本为OFF。如果迁移过程中不希望自动添加NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,则需要将该参数设置成ON。
1. 当explicit_defaults_for_timestamp为OFF,MySQL对于TIMESTAMP类型使用了非标准行为:
TIMESTAMP类型的列,如果没有显性定义NULL属性,将会自动添加NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP。如果显性定义NULL属性,则保留该属性。
表中第一个定义TIMESTAMP的列,要么显性指定NULL,要么显性指定DEFAULT或者ON UPDATE属性,或者自动增加DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP属性。
表中第二个定义TIMESTAMP的列,如果sql_mode没有设置成NO_ZERO_DATE,且没有显性指定NULL或者DEFAULT属性,会自动定义成DEFAULT '0000-00-00 00:00:00'。
如果设置成严格模式的NO_ZERO_DATE,则会报错:ERROR 1067 (42000): Invalid default value for 'xxx'
2. 当explicit_defaults_for_timestamp为ON时,该非标准行为将会废弃,该类型和其他类型的行为一致。