Правильный способ хранения даты MySQL после 2037 года
Я пытаюсь сохранить в MySQL поле date() с последовательной датой до 2037 года.
Например: 2065-12-01
Проблема в том, что поле возвращается: 1969-12-31
Как правильно записать эти значения в БД? Должен ли я использовать VARCHAR?
Я вычисляю date
значение поля вот так:
$future_date = date('Y-m-d', strtotime("+$number_years_to_add years"));
2 ответа
Вы, вероятно, используете поле метки времени для хранения дат, а не поле даты и времени.
Смотрите документацию mysql о типах данных datetime, а именно:
Тип DATE используется для значений с частью даты, но без части времени. MySQL извлекает и отображает значения DATE в формате "ГГГГ-ММ-ДД". Поддерживаемый диапазон: от 1000-01-01 до 9999-12-31.
Тип DATETIME используется для значений, которые содержат как дату, так и время. MySQL извлекает и отображает значения DATETIME в формате "ГГГГ-ММ-ДД ЧЧ: ММ: СС". Поддерживается диапазон от 1000-01-01 00:00:00 до 9999-12-31 23:59:59.
Тип данных TIMESTAMP используется для значений, которые содержат как дату, так и время. У TIMESTAMP есть диапазон от "1970-01-01 00:00:01" UTC до "2038-01-19 03:14:07" UTC.
Мне кажется, что вы используете PHP date
а также strtotime
вещи на 32-битной платформе. Эти функции превращаются в тыкву, как карета Золушки, в 03:14:07 UTC 19 января 2038 года.
Вы можете проверить новый класс php DateTime или перейти на 64-битную реализацию php.
Кроме того, прочитайте это. Доступ к датам в PHP после 2038 года
(Спасибо за обнаружение этой проблемы с предварительным уведомлением за 22 года. Другие не будут.)