Как следует хранить метки времени Unix в столбцах int? - PullRequest
57 голосов
/ 27 ноября 2010

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

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

Так что это значит? Будет ли конец хранения временных меток int в MySQL где-то в 2021 году, поскольку он не может пройти весь путь до 9999999999?

Ответ:

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

1 Ответ

88 голосов
/ 27 ноября 2010

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

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

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

...