MySQL中各种日期/时间字段类型的优缺点是什么?

时间:2009-01-22 16:30:13

标签: php mysql datetime timestamp lamp

MySQL中的日期和时间可以存储为DATETIME,TIMESTAMP和INTEGER(自1970年1月1日起的秒数)。每种产品的优点和缺点是什么,尤其是在LAMP堆栈下开发时?

5 个答案:

答案 0 :(得分:5)

  • TIMESTAMP存储在MySQL专有方法中(尽管它基本上只是一个由年,月,日,小时,分钟和秒组成的字符串),此外,每当记录为时,TIMESTAMP类型的字段都会自动更新插入或更改,并且没有给出明确的字段值:

    mysql> create table timestamp_test(
        id integer not null auto_increment primary key, 
        val varchar(100) not null default '', ts timestamp not null); 
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> insert into timestamp_test (val) values ('foobar');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> select * from timestamp_test;
    +----+--------+----------------+
    | id | val    | ts             |
    +----+--------+----------------+
    |  1 | foobar | 20090122174108 |
    +----+--------+----------------+
    1 row in set (0.00 sec)
    
    mysql> update timestamp_test set val = 'foo bar' where id = 1;
    Query OK, 1 row affected (0.00 sec)
    Rows matched: 1  Changed: 1  Warnings: 0
    
    mysql> select * from timestamp_test;
    +----+---------+----------------+
    | id | val     | ts             |
    +----+---------+----------------+
    |  1 | foo bar | 20090122174123 |
    +----+---------+----------------+
    1 row in set (0.00 sec)
    
    mysql> 
    
  • DATETIME是日期和时间的标准数据类型,它与MySQL中的日期和时间函数一起使用。我可能在实践中使用它

  • 不建议以INTEGER格式存储日期,因为您要打开真正的蠕虫病毒,因为时区,闰年等有趣的问题 - 至少如果您打算根据存储的特​​定日期查询数据库那个领域。

答案 1 :(得分:3)

我会使用MySQL中的DATETIME或DATE字段保存数据。至少,如果您要存储截至2038年的日期值:http://en.wikipedia.org/wiki/Year_2038_problem。如果您使用的是以不同方式存储整数的系统,则可能没有此问题。

比较日期值甚至时间戳仍然很容易。

SELECT * FROM myTable WHERE startDate > '2009-01-01'
SELECT * FROM myTable WHERE UNIX_TIMESTAMP(startDate) > 1232541482

答案 2 :(得分:2)

嗯,我想以下内容有助于澄清。

日期和时间可以存储在mysql的DATETIME字段中。

如果您希望在创建行时添加时间戳,则使用TIMESTAMP - 该字段将在创建时自动填充。

对Date使用整数稍微有些过分,因为这基本上是DATETIME所做的,但会为您完成所有耗时的转换。

您是否有兴趣了解特定的利益或缺点?

答案 3 :(得分:2)

mysql中的时间戳可能非常棘手。如果没有仔细声明,你最终可能会在每行更新时自动更改其值(即使你没有明确更新它)。

http://dev.mysql.com/doc/refman/5.0/en/timestamp.html

答案 4 :(得分:0)

如果您需要时间戳的毫秒保真度,则需要将其保存为整数。但要小心,这可能会使事情变得复杂。