Функция MySQL 5.5 UNIX_TIMESTAMP возвращает разные значения на prod и локальных машинах - PullRequest
0 голосов
/ 25 января 2019

У меня старая система PHP, использующая MySQL 5.5.47 в качестве БД.

Ребята, создавшие систему, приняли странное решение. В некоторых случаях они сохраняли значение даты без дня, например « 2018-01-00 ». Тип поля - ДАТА.

Во многих запросах используется предложение where, например: UNIX_TIMESTAMP(DATE(<DATE>)) BETWEEN 1514757600 AND 1546207210, где <DATE> - это столбец, содержащий записи типа «2018-01-00», «2018-02-00» и т. Д. Две метки времени представляют даты 2018-01-01 и 2018-12-31.

На производстве запросы этого типа выполняются без проблем. На моей локальной машине они не возвращают никаких результатов.

Что я обнаружил, если запустить команду: SELECT UNIX_TIMESTAMP( DATE( '2018-01-00' ) ) на производстве, то результат будет 1514757600 , но на моей локальной машине он вернет 0 .

Я использую композицию Docker, чтобы воспроизвести производство как можно ближе. Первоначально я использовал 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 голосов
/ 25 января 2019

Оказывается, ошибка в Mysql до 5.5.48. В примечаниях к выпуску 5.5.48 есть утверждение об исправлении ошибки, связанной с функцией unix_timestamp. https://dev.mysql.com/doc/relnotes/mysql/5.5/en/news-5-5-48.html

Когда недопустимая дата была передана в функцию UNIX_TIMESTAMP () с использованием функции STR_TO_DATE (), проверка не выполнялась до ее преобразования в значение метки времени. (Ошибка № 21564557)

...