简单问题:
我有 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。
为什么?有什么建议吗?
谢谢!
请您参考如下方法:
我假设您的两台服务器运行的 MySQL 版本不同。
当您将超出范围的时间戳传递给 UNIX_TIMESTAMP()
时,MySQL 返回 0
。
MariaDB(目前某些 Linux 发行版默认使用的 MySQL 分支)在相同情况下返回 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()
的 MySQL 文档和 a MariaDB-related article about this problem .