MySQL中两种日期类型datetime和timestamp的区别

本文深入探讨了MySQL中的datetime与timestamp两种日期类型的区别,包括允许空值、自定义、默认值、自动更新等功能,帮助开发者选择合适的日期类型以记录数据的创建时间和最后修改时间。
 初学PHP+MySQL,在开发一个简单的报名程序时,要求在每一条新插入的记录后面添加一个日期字段,方便日后查询和排序。于是立即百度,发现可以使用datetime或timestamp两种日期类型来实现。这对于爱纠结的我来说是不被允许的,于是立即去找它们的区别。但是搜出来的要么是长篇大论,要么没有重点,于是自己总结了下这些文章的精华部分,以求精益求精。

datetime
1、允许为空值,可以自定义值,系统不会自动修改其值。
2、不可以设定默认值,所以在不允许为空值的情况下,必须手动指定datetime字段的值才可以成功插入数据。
3、虽然不可以设定默认值,但是可以在指定datetime字段的值的时候使用now()变量来自动插入系统的当前时间。
结论:datetime类型适合用来记录数据的原始的创建时间,因为无论你怎么更改记录中其他字段的值,datetime字段的值都不会改变,除非你手动更改它。

timestamp
1、允许为空值,但是不可以自定义值,所以为空值时没有任何意义。
2、默认值为CURRENT_TIMESTAMP(),其实也就是当前的系统时间。
3、数据库会自动修改其值,所以在插入记录时不需要指定timestamp字段的名称和timestamp字段的值,你只需要在设计表的时候添加一个timestamp字段即可,插入后该字段的值会自动变为当前系统时间。
4、以后任何时间修改表中的记录时,对应记录的timestamp值会自动被更新为当前的系统时间。
结论:timestamp类型适合用来记录数据的最后修改时间,因为只要你更改了记录中其他字段的值,timestamp字段的值都会被自动更新。

### MySQL 中 `DATETIME` `TIMESTAMP` 数据类型区别MySQL 中,`DATETIME` `TIMESTAMP` 是两种用于存储日期时间的数据类型,但它们之间存在显著的区别[^1]。以下是两者的主要差异: #### 1. 存储范围 - **`DATETIME`**:支持的日期范围是从 `'1000-01-01 00:00:00'` 到 `'9999-12-31 23:59:59'`,总共需要 8 个字节来存储每个值[^1]。 - **`TIMESTAMP`**:支持的日期范围较小,从 `'1970-01-01 00:00:01' UTC` 到 `'2038-01-19 03:14:07' UTC`,仅需 4 个字节来存储每个值[^3]。 #### 2. 存储格式 - **`DATETIME`**:MySQL 将 `DATETIME` 值以固定的格式 `'YYYY-MM-DD HH:MM:SS'` 存储显示,不依赖于时区。 - **`TIMESTAMP`**:`TIMESTAMP` 值存储为 Unix 时间戳(自 `1970-01-01 00:00:01` UTC 起的秒数),并且会根据当前时区进行转换[^3]。 #### 3. 时区支持 - **`DATETIME`**:不考虑时区信息,存储的值始终是插入时的原始值。 - **`TIMESTAMP`**:时区密切相关。当数据插入或检索时,MySQL 会自动将 `TIMESTAMP` 值从当前时区转换为 UTC,并在检索时再转换回当前时区。 #### 4. 默认值自动更新 - **`DATETIME`**:默认情况下,`DATETIME` 不支持自动更新功能,必须显式设置其值。 - **`TIMESTAMP`**:可以定义为自动更新为当前时间戳。例如,使用 `DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP` 可以实现自动更新。 #### 5. 性能比较 尽管 `TIMESTAMP` 的存储空间更小,但在某些旧版本的数据库性能测试中,`DATETIME` 可能表现得更好[^4]。然而,现代 MySQL 版本已经优化了两者的性能差异,因此在大多数情况下,性能差异可以忽略不计。 #### 示例代码 以下是一个简单的示例,展示如何在表中使用 `DATETIME` `TIMESTAMP`: ```sql CREATE TABLE example_table ( id INT PRIMARY KEY, created_at DATETIME, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ); INSERT INTO example_table (id, created_at) VALUES (1, '2023-03-01 12:00:00'); ``` 在这个例子中,`created_at` 使用 `DATETIME` 类型存储固定的时间值,而 `updated_at` 使用 `TIMESTAMP` 类型并具有自动更新功能。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值