Chinaunix首页 | 论坛 | 博客
  • 博客访问: 744712
  • 博文数量: 95
  • 博客积分: 1754
  • 博客等级: 上尉
  • 技术积分: 1607
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-12 10:06
文章分类

全部博文(95)

文章存档

2015年(3)

2013年(15)

2012年(77)

分类: Mysql/postgreSQL

2012-12-13 17:36:49

本文在MYSQL5.1版本测试

 

关于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);

 

root@python 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;

 

//插入数据

root@python 17:07>insert into t2 select 1,current_timestamp;

Query OK, 1 row affected (0.00 sec)

Records: 1  Duplicates: 0  Warnings: 0

 

root@python 17:07>select * from t2;

+------+---------------------+

| a    | b                   |

+------+---------------------+

|    1 | 2012-12-13 17:07:25 |

+------+---------------------+

1 row in set (0.00 sec)

 

//稍微等待一下

root@python 17:07>update t2 set a=100;

Query OK, 1 row affected (0.00 sec)

Rows matched: 1  Changed: 1  Warnings: 0

 

root@python 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

root@python 17:08>select * from t2;

+------+---------------------+

| a    | b                   |

+------+---------------------+

|  100 | 2012-12-13 17:08:16 |

+------+---------------------+

1 row in set (0.00 sec)

 

root@python 17:11>update t2 set a=100;

Query OK, 0 rows affected (0.00 sec)

Rows matched: 1  Changed: 0  Warnings: 0

 

root@python 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”。这样就不会造成更新数据导致时间的更改。

 

yeartime类型

 

year类型只占用1个字节,对于year(4),显示的年份范围为1901-2155year(2)显示年份范围为1970-2070

 

time类型占用3个字节

 

概要:时间类型本着够用的原则,可以用timestamp就千万不要用datetime,可以用year的就不要用datetime,或则date类型。

阅读(2349) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~