MySQL 5.5 UNIX_TIMESTAMP函数在生产机和本地计算机上返回不同的值

时间:2019-01-25 13:32:51

标签: mysql docker unix-timestamp

我有一个旧的PHP系统,使用MySQL 5.5.47作为数据库。

创建系统的人做出了一个奇怪的决定。 在某些情况下,他们保存的日期值不带日期-例如“ 2018-01-00 ”。字段类型为DATE。

很多查询都使用where子句,例如:UNIX_TIMESTAMP(DATE(<DATE>)) BETWEEN 1514757600 AND 1546207210,其中<DATE>是包含诸如'2018-01-00','2018-02-00'等记录的列。 这两个时间戳分别表示日期2018年1月1日和2018年12月31日。

在生产中,这种类型的查询运行没有问题。 在我的本地计算机上,它们不返回任何结果。

我发现的是,如果我在生产环境中运行以下命令:SELECT UNIX_TIMESTAMP( DATE( '2018-01-00' ) ),结果是 1514757600 ,但是在我的本地计算机上,它返回 0

>

我正在使用Docker compose尽可能接近地复制产品。最初,当我遇到此问题时,我已将MySQL 5.6用于本地开发,我尝试使用MySQL 5.5.62,但结果是相同的。

有人知道我如何设置本地MySQL作为生产版本吗?


查询生产

mysql> SELECT DATE('2018-01-00'), UNIX_TIMESTAMP(DATE('2018-01-00')), UNIX_TIMESTAMP('2018-01-00');
+--------------------+------------------------------------+------------------------------+
| DATE('2018-01-00') | UNIX_TIMESTAMP(DATE('2018-01-00')) | UNIX_TIMESTAMP('2018-01-00') |
+--------------------+------------------------------------+------------------------------+
| 2018-01-00         |                         1514757600 |                            0 |
+--------------------+------------------------------------+------------------------------+

查询本地

mysql> SELECT DATE('2018-01-00'), UNIX_TIMESTAMP(DATE('2018-01-00')), UNIX_TIMESTAMP('2018-01-00');
+--------------------+------------------------------------+------------------------------+
| DATE('2018-01-00') | UNIX_TIMESTAMP(DATE('2018-01-00')) | UNIX_TIMESTAMP('2018-01-00') |
+--------------------+------------------------------------+------------------------------+
| 2018-01-00         |                                  0 |                            0 |
+--------------------+------------------------------------+------------------------------+

1 个答案:

答案 0 :(得分:0)

事实证明,这是Mysql 5.5.48之前版本中的 bug 。在5.5.48的发行说明中,有一条声明涉及修复与unix_timestamp函数有关的错误。 https://dev.mysql.com/doc/relnotes/mysql/5.5/en/news-5-5-48.html

  

当使用STR_TO_DATE()函数向UNIX_TIMESTAMP()函数提供了无效的日期时,在将其转换为时间戳值之前未进行任何检查。 (缺陷号21564557)