Подтвердить что ты не робот

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

У меня есть дилемма о сохранении значений даты и времени в формате 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?

4b9b3361

Ответ 1

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

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

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

    так что диапазон на самом деле тот же

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

Ответ 2

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

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

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

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

Ответ 3

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

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