视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
mysql中DATETIME、DATE和TIMESTAMP的区别_MySQL
2020-11-09 18:38:53 责编:小采
文档


bitsCN.com

mysql中DATETIME、DATE和TIMESTAMP的区别

DATETIME、DATE和 TIMESTAMP类型是相似的。本篇描述了它们的特性以及它们的相似点与不同点。

DATETIME类型可用于需要同时包含日期和时间信息的值。MySQL 以 'YYYY-MM-DD HH:MM:SS'格式检索与显示 DATETIME 类型。支持的范围是'1000-01-0100:00:00' 到 '9999-12-3123:59:59'。(“支持”的含义是,尽管更早的值可能工作,但不能保证他们均可以。)

DATE类型可用于需要一个日期值而不需要时间部分时。MySQL 以 'YYYY-MM-DD' 格式检索与显示DATE值。支持的范围是 '1000-01-01' 到'9999-12-31'。

TIMESTAMP列类型提供了一种类型,通过它你可以以当前操作的日期和时间自动地标记 Insert 或Update 操作。如果一张表中有多个TIMESTAMP列,只有第一个被自动更新。

“完整”TIMESTAMP格式是14位,但TIMESTAMP列也可以用更短的显示尺寸创造

最常见的显示尺寸是6、8、12、和14。

你可以在创建表时指定一个任意的显示尺寸,但是定义列长为0或比14大均会被强制定义为列长14。

列长在从1~13范围的奇数值尺寸均被强制为下一个更大的偶数。

列如:

定义字段长度 强制字段长度

TIMESTAMP(0) -> TIMESTAMP(14)

TIMESTAMP(15)-> TIMESTAMP(14)

TIMESTAMP(1) -> TIMESTAMP(2)

TIMESTAMP(5) -> TIMESTAMP(6)

所有的TIMESTAMP列都有同样的存储大小,

使用被指定的时期时间值的完整精度(14位)存储合法的值不考虑显示尺寸。

不合法的日期,将会被强制为0存储

自动更新第一个 TIMESTAMP列在下列任何条件下发生:

列值没有明确地在一个 Insert 或LOAD DATAINFILE 语句中被指定。

列值没有明确地在一个 Update语句中被指定,并且其它的一些列值已发生改变。(注意,当一个 Update 设置一个列值为它原有值时,这将不会引起TIMESTAMP列的更新,因为,如果你设置一个列值为它当前值时,MySQL 为了效率为忽略更新。)

明确地以 NULL 设置 TIMESTAMP 列。

第一个列以外其它 TIMESTAMP列,可以设置到当前的日期和时间,只要将该列赋值 NULL 或 NOW()。

任何 TIMESTAMP列均可以被设置一个不同于当前操作日期与时间的值,这通过为该列明确指定一个你所期望的值来实现。这也适用于第一个TIMESTAMP列。这个选择性是很有用的,举例来说,当你希望 TIMESTAMP列保存该记录行被新添加时的当前的日期和时间,但该值不再发生改变,无论以后是否对该记录行进行过更新:

当该记录行被建立时,让 MySQL设置该列值。这将初始化该列为当前日期和时间。

以后当你对该记录行的其它列执行更新时,为TIMESTAMP列值明确地指定为它原来的值。

另一方面,你可能发现更容易的方法,使用DATETIME列,当新建记录行时以 NOW()初始化该列,以后在对该记录行进行更新时不再处理它。

示例(译者注):

mysql> Create TABLE `tA` (-> `id` int(3) unsigned NOT NULL auto_increment,-> `date1` timestamp(14) NOT NULL,-> `date2` timestamp(14) NOT NULL,-> PRIMARY KEY (`id`)-> ) TYPE=MyISAM;Query OK, 0 rows affected (0.01 sec)mysql> Insert INTO `tA` SET `id` = 1;Query OK, 1 row affected (0.02 sec)# 没有明确地指定第一个 timestamp 列值,该列值被设为插入的当前时刻# 没有明确地指定其它的 timestamp 列值,MySQL 则认为插入的是一个非法值,而该列值被设为0mysql> Insert INTO `tA` S (2, NOW(), NULL);Query OK, 1 row affected (0.01 sec)mysql> Select * FROM `tA`;+----+----------------+----------------+| id | date1 | date2 |+----+----------------+----------------+| 1 | 20030503104118 | 00000000000000 || 2 | 20030503104254 | 20030503104254 |+----+----------------+----------------+2 rows in set (0.00 sec)mysql> Update `tA` SET `id` = 3 Where `id` = 1;Query OK, 1 row affected (0.01 sec)Rows matched: 1 Changed: 1 Warnings: 0# 对某一记录行进行了更新,第一个 timestamp 列值也将被更新mysql> Update `tA` SET `id` = 2 Where `id` = 2;Query OK, 0 rows affected (0.00 sec)Rows matched: 1 Changed: 0 Warnings: 0# MySQL 忽略了这次操作,第一个 timestamp 列值不会被更新mysql> Select * FROM `tA`;+----+----------------+----------------+| id | date1 | date2 |+----+----------------+----------------+| 3 | 20030503104538 | 00000000000000 || 2 | 20030503104254 | 20030503104254 |+----+----------------+----------------+2 rows in set (0.00 sec)mysql> Update `tA` SET `id` = 1,`date1`=`date1` Where `id` = 3;Query OK, 1 row affected (0.00 sec)Rows matched: 1 Changed: 1 Warnings: 0# 明确地指定了第一个 timestamp 列值为它原有值,该值将不会被更新mysql> Select * FROM `tA`;+----+----------------+----------------+| id | date1 | date2 |+----+----------------+----------------+| 1 | 20030503104538 | 00000000000000 || 2 | 20030503104254 | 20030503104254 |+----+----------------+----------------+2 rows in set (0.00 sec)* 以上结果在 MySQL 4.0.12 中测试


bitsCN.com

下载本文
显示全文
专题