Использование TIMESTAMP MySQL для непосредственного хранения временных меток

У меня есть дилемма о сохранении значений даты и времени в формате MySQL TIMESTAMP и в обычном формате UNSIGNED INT. Основными соображениями здесь являются скорость поиска, соответствующие вычисления диапазона в PHP и случайное форматирование в читаемые человеком значения.

Объем памяти, необходимый для каждого типа и их диапазонов:

DATETIME 8 bytes '1000-01-01 00:00:00' to '9999-12-31 23:59:59' TIMESTAMP 4 bytes '1970-01-01 00:00:01' UTC to '2038-01-19 03:14:07' UTC UNSIGNED INT 4 bytes (Maximum Value 4294967295) 

Мне вообще не нужен диапазон DATETIME. Я разорван между TIMESTAMP и UNSIGNED INT.

Аргументы в пользу UNSIGNED INT:

  • Временная метка UNIX из 4294967295 конвертирует в Sun, 07 февраля 2106 06:28:15 GMT, что больше, чем TIMESTAMP и достаточно для меня
  • Сравнение этих временных меток непосредственно в PHP будет скорее, чем преобразование TIMESTAMPs через strtotime (), а затем их сравнение

Единственное преимущество, которое дает TIMESTAMP, – это когда я читаю значения из таблицы mysql вручную и должен «видеть» их.

Есть ли веские причины использовать TIMESTAMP, а не UNSIGNED INT?

    Аргументы для TIMESTAMP

    • Он неявно хранит данные в часовом поясе GMT. Независимо от того, в какой временной зоне вашего сеанса. Полезно, если вам нужно использовать разные часовые пояса.
    • Вы можете иметь автоматические столбцы с отметкой времени, используя DEFAULT CURRENT_TIMESTAMP или ON UPDATE CURRENT_TIMESTAMP (один столбец на таблицу только до MySQL 5.6.5)
    • Вы можете использовать функцию datetime для сравнения даты, добавления, вычитания, поиска диапазона и т. Д., Без использования функции FROM_UNIXTIME() – это упростит запись запросов, которые могут использовать индексы
    • В PHP

       >> date('Ymd h:i:s',4294967295); '1969-12-31 11:59:59' 

      поэтому диапазон на самом деле тот же

    Когда UNIX_TIMESTAMP () используется в столбце TIMESTAMP, функция возвращает значение внутренней метки времени непосредственно, без неявного преобразования «строка-в-Unix-timestamp»

    Единственное реальное использование TIMESTAMP – это когда вы хотите, чтобы это поле автоматически обновлялось при обновлении строки (что является поведением по умолчанию для этого поля) или когда требования к хранилищу данных настолько строги, что 4 байта на строку действительно имеют значение для вы.

    На самом деле сравнение должно быть между DATETIME и UNSIGNED INT, и я бы рекомендовал DATETIME, потому что:

    • Вы можете использовать собственные функции даты и времени MySQL для выбора диапазонов дат и т. Д.
    • Это тривиально легко выбрать эти даты как временные метки UNIX для легкого форматирования в PHP: SELECT UNIX_TIMESTAMP(field) FROM table , нет необходимости выбирать исходное значение и использовать strtotime
    • Легче читать и редактировать поля в базе данных напрямую, если вам нужно (как вы указали).
    • Нет ограничений по диапазону дат

    На мой взгляд, точка 2 сама по себе устраняет любую причину хранения в целых числах.

    Это может быть не «научный» ответ, но я всегда нахожу, как MySql обрабатывает преобразование, арифметику, сравнение и т. Д. На столбцах TIMESTAMP запутывает. Столбец UNSIGNED INT намного более прямолинейный, и я всегда знаю, чего ожидать.

    PS Возможно, еще одна вещь в пользу столбца TIMESTAMP – это возможность автоматически устанавливать текущее время после каждого обновления или вставки, но это не то, с чем вы не можете жить.