Использование MySQL TIMESTAMP против хранения временных меток напрямую - PullRequest
37 голосов
/ 11 августа 2011

Я стою перед дилеммой о сохранении значений даты и времени в формате TIMESTAMP MySQL по сравнению с пользовательским форматом 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?

Ответы [ 3 ]

25 голосов
/ 11 августа 2011

Аргументы для 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-timestamp»

9 голосов
/ 11 августа 2011

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

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

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

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

3 голосов
/ 11 августа 2011

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

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

...