关于datetime,date,timestamp,year,time时间类型
datetime占用8个字节
日期范围:”1000-01-01 00:00:00” 到”9999-12-31 23:59:59”
date占用3个字节
可以显示范围:”1000-01-01” 到”9999-12-31”
timestamp占用4个字节
timestamp显示结果跟datetime一样,固定格式:”YYYY-MM-DD HH:MM:SS”
不同的是:
1,timestamp占用4个字节,显示的范围”1970-01-01 00:00:00”到”2038-01-19 03:14:17”.
2,在建表时,列为timestamp的日期类型可以设置为一个默认值,而datetime不行。
3,在更新表时,可以设置timestamp类型的列自动更新为当前时间。
4,在一个表中,只能有一行指定的时间类型能指定为“TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP”,其他列的时间类型需要指定为” timestamp NOT NULL DEFAULT ‘0000-00-00 00:00:00‘”。
示例1:
CREATE TABLE t (a INT,b TIMESTAMP DEFAULT CURRENT_TIMESTAMP) ENGINE=INNODB CHARSET=utf8;
SHOW CREATE TABLE t;
INSERT INTO t(a) VALUES (1);
[email protected] 17:04>SELECT * FROM t;
+------+---------------------+
| a | b |
+------+---------------------+
| 1 | 2012-12-13 17:03:58 |
+------+---------------------+
示例2:
CREATE TABLE `t2` (
`a` INT(11) DEFAULT NULL,
`b` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=INNODB DEFAULT CHARSET=utf8;
//插入数据
[email protected] 17:07>insert into t2 select 1,current_timestamp;
Query OK, 1 row affected (0.00 sec)
Records: 1 Duplicates: 0 Warnings: 0
[email protected] 17:07>select * from t2;
+------+---------------------+
| a | b |
+------+---------------------+
| 1 | 2012-12-13 17:07:25 |
+------+---------------------+
1 row in set (0.00 sec)
//稍微等待一下
[email protected] 17:07>update t2 set a=100;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
[email protected] 17:08>select * from t2;
+------+---------------------+
| a | b |
+------+---------------------+
| 100 | 2012-12-13 17:08:16 |
+------+---------------------+
1 row in set (0.00 sec)
发现update操作后,更改了a列的值,b列的时间有原来的“2012-12-13 17:07:25” 更新为” 2012-12-13 17:08:16”。
//如果update操作更新a列的值,而实际没有改变行中的任何数据,因此b列的不会进行相应的操作。请看实例3。
实例3:
[email protected] 17:08>select * from t2;
+------+---------------------+
| a | b |
+------+---------------------+
| 100 | 2012-12-13 17:08:16 |
+------+---------------------+
1 row in set (0.00 sec)
[email protected] 17:11>update t2 set a=100;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1 Changed: 0 Warnings: 0
[email protected] 17:11>select * from t2;
+------+---------------------+
| a | b |
+------+---------------------+
| 100 | 2012-12-13 17:08:16 |
+------+---------------------+
1 row in set (0.00 sec)
总结下:在使用timestamp类型时,由于目前程序中时间不为NULL时,是程序赋值的。请在制定timestamp类型时,不要指定“TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP”,而指定“TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP”。这样就不会造成更新数据导致时间的更改。
year和time类型
year类型只占用1个字节,对于year(4),显示的年份范围为1901-2155;year(2)显示年份范围为1970-2070。
time类型占用3个字节
概要:时间类型本着够用的原则,可以用timestamp就千万不要用datetime,可以用year的就不要用datetime,或则date类型。