mysql的datetime与timestamp设置null对比

本文介绍了在MySQL 5.7中,针对timestamp和datetime类型的NOTNULL DEFAULT current_timestamp()设置,timestamp会自动填充当前时间,而datetime在null时设置会报错。通过实例对比了两种行为并引用官方文档进行说明。

版本:5.7

结论:对于NOT NULL DEFAULT current_timestamp(),若是timestamp类型设置为null会被设置成当前时间,而对于datetime会报错

1.timestamp类型

CREATE TABLE `table_1` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) DEFAULT NULL,
  `create_time` timestamp(6) NOT NULL DEFAULT current_timestamp(6) COMMENT '创建时间',
   PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ;

insert into table_1(name, create_time) values('1', null);

select * from table_1;

结果:

 2.datetime类型

CREATE TABLE `table_2` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) DEFAULT NULL,
  `create_time` datetime NOT NULL DEFAULT current_timestamp() COMMENT '创建时间',
   PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ;


insert into table_2(name, create_time) values('1', null)

结果:

参考文档

MySQL :: MySQL 5.7 Reference Manual :: 11.2.6 Automatic Initialization and Updating for TIMESTAMP and DATETIMEhttps://dev.mysql.com/doc/refman/5.7/en/timestamp-initialization.html

 In addition, if the explicit_defaults_for_timestamp system variable is disabled, you can initialize or update any TIMESTAMP (but not DATETIME) column to the current date and time by assigning it a NULL value, unless it has been defined with the NULL attribute to permit NULL values. 

<think>嗯,用户问的是MySQL中的DATETIMETIMESTAMP的选择指南。我得先回忆一下两者的区别。首先,存储范围方面,DATETIME是从1000年到9999年,而TIMESTAMP是1970到2038年。所以如果需要更早或更晚的时间,DATETIME更合适。 然后是时区处理。TIMESTAMP会转换成UTC存储,检索时再转回当前时区,适合需要时区转换的应用。而DATETIME则按写入的值存储,不自动转换。这点很重要,特别是跨国应用可能要注意。 存储空间方面,TIMESTAMP占4字节,DATETIME5到8字节,具体取决于版本。MySQL5.6.4之前是8字节,之后是5字节加小数秒的存储。所以如果存储空间紧张,TIMESTAMP更好。 自动更新功能,TIMESTAMP可以设置默认值和自动更新,适合记录行修改时间。DATETIME在5.6.5之后也支持,但之前不行。需要确认用户使用的MySQL版本。 默认值和是否允许NULLTIMESTAMP如果不指定默认值,默认会按NOT NULL处理,第一个字段可能自动初始化。而DATETIME默认允许NULL,除非显式设置。 索引方面,两者都可以建索引,但TIMESTAMP更小,可能效率更高。不过实际影响可能不大,需要具体情况分析。 还有2038年问题,TIMESTAMP到2038年会溢出,如果项目长期使用需要考虑这点。DATETIME没有这个问题。 用户可能需要根据他们的应用场景来选择。比如日志记录需要自动更新时间戳的话,TIMESTAMP合适。如果需要存储历史日期或未来的计划时间,DATETIME更好。时区敏感的应用TIMESTAMP更方便,而空间敏感的情况选TIMESTAMP。 还要注意用户是否了解他们的MySQL版本,因为不同版本支持的特性不同。比如自动更新和存储空间的变化。可能需要提醒用户检查版本信息。 总结的话,应该分点列出区别,然后给出选择建议,结合具体使用场景。确保用户能根据存储范围、时区、空间、自动更新等因素做出合适的选择。</think>以下是MySQLDATETIMETIMESTAMP类型的选择指南,按核心差异分点说明: 一、存储范围差异 $$ \text{DATETIME: '1000-01-01 00:00:00' → '9999-12-31 23:59:59'} $$ $$ \text{TIMESTAMP: '1970-01-01 00:00:01' UTC → '2038-01-19 03:14:07' UTC} $$ * 需要存储公元1000年前或2038年后的时间必须选DATETIME * 历史数据系统推荐DATETIME(如考古记录) 二、时区处理机制 1. TIMESTAMP: - 存入时自动转换当前时区→UTC时间 - 取出时自动转换UTC→当前时区时间 - 适合跨国系统(如跨境电商订单时间记录) 2. DATETIME: - 按字面值直接存储 - 无自动时区转换 - 适合固定时区场景(如本地化设备日志) 三、存储空间对比 | 类型 | MySQL <5.6.4 | MySQL ≥5.6.4 | |----------|-------------|-------------| | DATETIME | 8字节 | 5字节(+小数秒) | | TIMESTAMP| 4字节 | 4字节(+小数秒) | * 高频写入场景优先考虑TIMESTAMP(如IoT设备时序数据) 四、自动更新特性 ```sql -- TIMESTAMP自动更新示例 CREATE TABLE logs ( id INT, ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ); -- DATETIME需要5.6.5+版本才支持 CREATE TABLE events ( id INT, dt DATETIME(6) DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6) ); ``` * 审计字段建议用TIMESTAMP(自动记录修改时间) 五、NULL处理差异 - TIMESTAMP字段未显式声明`NULL`时: $$ \text{默认NOT NULL,第一个TIMESTAMP字段自动初始化} $$ - DATETIME字段: $$ \text{默认允许NULL,需显式设置NOT NULL} $$ 六、索引效率 1. TIMESTAMP索引体积比DATETIME小25%-50% 2. 范围查询时TIMESTAMP性能优势更明显 3. 超大规模数据($n > 10^8$条)推荐TIMESTAMP 选择决策树: ``` 是否需要存储2038年后的时间? → 是 → DATETIME ↓ 否 是否需要自动时区转换? → 是 → TIMESTAMP ↓ 否 数据量是否极大? → 是 → TIMESTAMP ↓ 否 是否需要微秒精度? → 是 → DATETIME(6) ↓ 否 是否需要自动更新? → 是 → TIMESTAMP ↓ 否 DATETIME ``` 特殊场景注意事项: 1. 夏令时地区:TIMESTAMP可能产生重复时间戳 2. 分布式系统:建议统一用TIMESTAMP+UTC时区 3. 金融交易系统:推荐DATETIME(6)保留微秒时间戳 通过综合$存储需求$、$时区策略$、$系统规模$三个维度,可做出最优选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值