Использование 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?
Ответы
Ответ 1
Аргументы для TIMESTAMP
Когда 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 - его способность автоматически настраиваться на текущее время после каждого обновления или вставки, но это не то, с чем вы не можете жить без.