mysql 的datetime和timestamp的知识小结

本文对比了MySQL中datetime和timestamp两种日期时间类型的特性与区别,包括取值范围、自动初始化和更新行为、时区转换能力及存储大小。通过具体实例展示了timestamp在不同场景下的表现,如自动更新限制和NULL值处理。
总结下mysql的datetime和timestamp两种类型的相关知识
 
mysql 的datetime和timestamp的区别
  1. datetime的取值范围是1000-01-01 00:00:00 到9999-12-31 23:59:59 而timestamp仅为1970-01-01 00:00:00 到2037 23:59:59
  2. timestamp具有自动初始化和自动更新的特性:自动初始化为当前日期和时间,当发生变化时自动更新为当前时间
  3. timestamp可以自动转换为客户端时区
  4. timestamp 只需要4个字节而datetime需要8个字节

对于timestamp还有以下特性:
  1. 一张表中可以同时有多个TIMESTAMP类型列,但是只能有一列具有上述特性,其他列都会被初始化为0测试验证如下

create table test (id int(32) ,time1 timestamp, time2 timestamp); 
insert test values(1);
insert test values(2);

select * from test;
+------+---------------------+---------------------+
| id   | time1               | time2               |
+------+---------------------+---------------------+
|    1 | 2014-03-04 11:51:56 | 0000-00-00 00:00:00 |
|    2 | 2014-03-04 11:51:58 | 0000-00-00 00:00:00 |
+------+---------------------+---------------------+
       
可以看出只有time1被初始化了当前时间

而如果执行
alter table test modify column `time2` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
ERROR 1293 (HY000): Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause
即看出不允许一张表同时有两个都是自动更新的。

而可以通过设置为NULL将其值更新为当前时间
insert test(id,time2) values(3, NULL);

+------+---------------------+---------------------+
| id   | time1               | time2               |
+------+---------------------+---------------------+
|    1 | 2014-03-04 11:51:56 | 0000-00-00 00:00:00 |
|    2 | 2014-03-04 11:51:58 | 0000-00-00 00:00:00 |
|    3 | 2014-03-04 11:56:07 | 2014-03-04 11:56:07 |
+------+---------------------+---------------------+

mysql 建表时,如果不对timestamp做任何限制,则默认就是自动初始化和自动更新的特性


show create table test;
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                                                             |
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| test  | CREATE TABLE `test` (
  `id` int(32) DEFAULT NULL,
  `time1` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `time2` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00'
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |


同时对于timestamp 的not null,说明其不能保存NULL值,但是仍然可以给该列赋NULL,数据库会自动将其保存为当前日期和时间

如果希望timestamp自动初始化但是不自动更新,可以只使用DEFAULT CURRENT_TIMESTAMP

<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版本。 默认值是否允许NULL。TIMESTAMP如果不指定默认值,默认会按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、付费专栏及课程。

余额充值