标题:[翻译] MySQL 5.0 参考手册
只看楼主
京山游侠
Rank: 1
等 级:新手上路
帖 子:96
专家分:0
注 册:2006-2-12
得分:0 

1.4.5. 千年虫问题

MySQL本身是不存在千年虫问题的:

  • MySQL Server使用Unix时间函数把2037年以内的时间保存在TIMESTAMP类型中。 使用DATEDATETIME 类型,则9999年以内的值都是可以接受的。

  • 所有的MySQL的时间函数都在同一个源文件sql/time.cc里面实现,所有的代码都是是2000年安全的。

  • 在MySQL,YEAR数据类型能够使用一个字节储存0年和19012155 年,并且使用四个数字显示。所有用两位数字表示的年份都被认为是19702069,比如你给一个类型为YEAR的列插入数据01, MySQL Server 会认为它是2001。

下面简单的例子说明在MySQL Server中,使用DATEDATETIME值表示9999年以内的时间, 和使用 TIMESTAMP 值表示2030年以前的时间,都是不会有任何问题的:

mysql> DROP TABLE IF EXISTS y2k;
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE TABLE y2k (date DATE,
    ->                   date_time DATETIME,
    ->                   time_stamp TIMESTAMP);
Query OK, 0 rows affected (0.01 sec)

mysql> INSERT INTO y2k VALUES
    -> ('1998-12-31','1998-12-31 23:59:59','1998-12-31 23:59:59'),
    -> ('1999-01-01','1999-01-01 00:00:00','1999-01-01 00:00:00'),
    -> ('1999-09-09','1999-09-09 23:59:59','1999-09-09 23:59:59'),
    -> ('2000-01-01','2000-01-01 00:00:00','2000-01-01 00:00:00'),
    -> ('2000-02-28','2000-02-28 00:00:00','2000-02-28 00:00:00'),
    -> ('2000-02-29','2000-02-29 00:00:00','2000-02-29 00:00:00'),
    -> ('2000-03-01','2000-03-01 00:00:00','2000-03-01 00:00:00'),
    -> ('2000-12-31','2000-12-31 23:59:59','2000-12-31 23:59:59'),
    -> ('2001-01-01','2001-01-01 00:00:00','2001-01-01 00:00:00'),
    -> ('2004-12-31','2004-12-31 23:59:59','2004-12-31 23:59:59'),
    -> ('2005-01-01','2005-01-01 00:00:00','2005-01-01 00:00:00'),
    -> ('2030-01-01','2030-01-01 00:00:00','2030-01-01 00:00:00'),
    -> ('2040-01-01','2040-01-01 00:00:00','2040-01-01 00:00:00'),
    -> ('9999-12-31','9999-12-31 23:59:59','9999-12-31 23:59:59');
Query OK, 14 rows affected, 2 warnings (0.00 sec)
Records: 14  Duplicates: 0  Warnings: 2

mysql> SELECT * FROM y2k;
+------------+---------------------+---------------------+
| date       | date_time           | time_stamp          |
+------------+---------------------+---------------------+
| 1998-12-31 | 1998-12-31 23:59:59 | 1998-12-31 23:59:59 |
| 1999-01-01 | 1999-01-01 00:00:00 | 1999-01-01 00:00:00 |
| 1999-09-09 | 1999-09-09 23:59:59 | 1999-09-09 23:59:59 |
| 2000-01-01 | 2000-01-01 00:00:00 | 2000-01-01 00:00:00 |
| 2000-02-28 | 2000-02-28 00:00:00 | 2000-02-28 00:00:00 |
| 2000-02-29 | 2000-02-29 00:00:00 | 2000-02-29 00:00:00 |
| 2000-03-01 | 2000-03-01 00:00:00 | 2000-03-01 00:00:00 |
| 2000-12-31 | 2000-12-31 23:59:59 | 2000-12-31 23:59:59 |
| 2001-01-01 | 2001-01-01 00:00:00 | 2001-01-01 00:00:00 |
| 2004-12-31 | 2004-12-31 23:59:59 | 2004-12-31 23:59:59 |
| 2005-01-01 | 2005-01-01 00:00:00 | 2005-01-01 00:00:00 |
| 2030-01-01 | 2030-01-01 00:00:00 | 2030-01-01 00:00:00 |
| 2040-01-01 | 2040-01-01 00:00:00 | 0000-00-00 00:00:00 |
| 9999-12-31 | 9999-12-31 23:59:59 | 0000-00-00 00:00:00 |
+------------+---------------------+---------------------+
14 rows in set (0.00 sec)

最后两行中TIMESTAMP列的值全部为0, 是因为我们添加的值(2040, 9999)超过了TIMESTAMP的最大范围。TIMESTAMP数据类型,是用来储存当前时间的,在32位的系统上只能表示'1970-01-01 00:00:00''2030-01-01 00:00:00' 的返回。在64位机器上,TIMESTAMP可以处理2106年以内的数据(无符号值)。

尽管MySQL Server本身是两千年安全的,你仍然可能会因为使用它的程序不是两千年安全的而遇到问题,比如,很多老程序使用两位数字储存和操作年份,而不是使用四位数字, This problem may be compounded by applications that use values such as 00 or 99 as “missing” value indicators. 很不幸,这种问题很难解决 因为不同的程序可能由不同的程序员编写,而他们可能使用不同的习惯和不同的时间处理函数。

因此, 即使 MySQL Server 没有千年虫问题,应用程序依然有责任提供明确的输入。 请查看 Section 11.3.4, “Y2K Issues and Date Types”, 以 了解MySQL Server对以两位数字表示时间的不明确的输入的处理规则。


相濡以沫,不如相忘于江湖
2006-02-23 23:01
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
得分:0 

等你的CHM,省得自己动手了


九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2006-03-06 13:18
小猎狗
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2006-3-8
得分:0 

不错

继续努力 !


辛苦!

2006-03-08 15:46
seeker
Rank: 1
等 级:新手上路
帖 子:172
专家分:0
注 册:2005-6-5
得分:0 
精神可嘉!继续努力!E文的也快要看完了。

我相信总有一片天空属于我!http://myseeker. E-Mail:lwqcny@
2006-03-11 00:24
haizei
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2006-4-3
得分:0 


2006-04-03 22:55
goga21cn
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2006-4-4
得分:0 
向楼主致敬!

2006-04-04 11:50
pen
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2006-4-5
得分:0 
我还要看
2006-04-06 11:16
dreame
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:521
专家分:0
注 册:2005-10-23
得分:0 

宝贵的资料啊!!


有时候真的想放弃寂寞的等待,但她是那么的可爱!I love u forever!
2006-04-10 19:11
橘子
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2006-4-16
得分:0 

这些命令可以用在vf6.0中用吗


我很平凡,也不可爱!
2006-04-16 09:33
jeff8459
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2006-4-22
得分:0 
多谢!


2006-04-22 10:35



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-45438-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.134571 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved