使用unix_timestamp的mysql奇怪的情况

时间:2013-08-08 22:10:49

标签: mysql unix-timestamp

简单问题:

我有2个Mysql服务器,我在两个中运行此查询:

select unix_timestamp('0000-00-00 00:00:00');

结果:

在服务器1上:

mysql> select unix_timestamp('0000-00-00 00:00:00');
+---------------------------------------+
| unix_timestamp('0000-00-00 00:00:00') |
+---------------------------------------+
|                                  NULL |
+---------------------------------------+

在服务器2上:

mysql> select unix_timestamp('0000-00-00 00:00:00');
+---------------------------------------+
| unix_timestamp('0000-00-00 00:00:00') |
+---------------------------------------+
|                                     0 |
+---------------------------------------+

在这两种情况下我都需要0。

为什么呢?有什么建议吗?

谢谢!

2 个答案:

答案 0 :(得分:3)

我将假设您的两台服务器不运行相同的MySQL版本。

当您将时间戳传递给超出范围的0时,MySQL会返回UNIX_TIMESTAMP()

MariaDB(某些Linux发行版当前使用的MySQL fork作为默认值)在相同的情况下返回NULL

如果时间戳在1970-01-01 00:00:00之前或2038-01-19 03:14:08之后,则时间戳超出UNIX时间范围。这是因为它存储为32位无符号整数。 1970-01-01 00:00:00是0,由于它是未签名的,因此在此之前无法表达任何内容。在2038-01-19 03:14:08,整数将达到其最大值,之后的任何内容也不能表示为UNIX时间戳。 (在某些系统上已经存在的解决方案是使用64位整数,给我们额外的几十万年。)

请参阅UNIX_TIMESTAMP()a MariaDB-related article about this problem的MySQL文档。

答案 1 :(得分:0)

错误处理

在MySQL和MariaDB 5.3之前,UNIX_TIMESTAMP()的错误参数返回0.从Maria_ 5.3开始,我们为UNIX_TIMESTAMP()的错误参数返回NULL。