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

Как следует хранить временные метки unix в столбцах int?

У меня есть таблица протоколирования, которая будет содержать миллионы записей по статистическим соображениям. Все столбцы являются внутренними ключами. Я также собираюсь добавить столбец timestamp для каждой строки. Учитывая, что DATETIME принимает 8 бит - я буду использовать int(10) unsigned, чтобы сократить пространство для хранения (и индекс в этом столбце) пополам.

Однако мне интересно, когда этот столбец больше не будет работать. В 3:14:07 утра 19 января 2038 года значение 9,999,999,999 будет проблемой для временных меток UNIX - но unsigned int в MySQL поддерживает только до 4 294 967 295, а временная метка 4294967295 показывает недопустимое число в моем приложении PHP.

Итак, что это значит? Является ли конец хранения int timestamps в MySQL, когда-нибудь в 2021 году, так как он не может сделать все до 9999999999?

Ответ:

  • 2147483647 - 2038 (не 9999999999), поэтому проблем нет.
  • unsigned не требуется, так как 2147483647 отлично подходит для подписанного MySQL int.
4b9b3361

Ответ 1

Стандартные временные метки UNIX - это 32-битное целое число, которое в MySQL является регулярным столбцом "int". Там вы не можете хранить 99999999999, так как этот путь вне диапазона представления - самый высокий 32-битный int любого вида может пойти в 4 294 967 295. Самая высокая подписанная 32-битная входы составляет 2 147 483 647.

Если/когда отметки времени UNIX переходят к 64-битовому типу данных, вам придется использовать MySQL "bigint" для их хранения.

Что касается int(10), то часть (10) предназначена только для показа. MySQL будет по-прежнему использовать полный 32-битный внутренний номер для хранения номера, но отображать только 10, когда вы делаете выбор в таблице.