MySQL TIMESTAMP хранится как время Unix или как ISO 8601? - PullRequest
0 голосов
/ 08 ноября 2018

Я попал в небольшое замешательство. Сохраняет ли MySQL TIMESTAMP как время Unix в секундах, например 1541645714

Или хранится в формате ISO 8601 2018-11-08T02:55:14+00:00

Я не уверен, почему я всегда думал, что последний был только входным форматом, и что MySQL преобразовал этот формат во время Unix. Мне это показалось бы более эффективным.

Может кто-нибудь прояснить это для меня? Как на самом деле хранится TIMESTAMP? Я просмотрел документацию и не могу найти никаких ответов.

Спасибо за понимание / помощь.

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Тебе должно быть все равно

Сохраняет ли MySQL TIMESTAMP как метку времени Unix в секундах, например, 1541645714

Или он действительно хранится в формате ISO 8601 2018-11-08T02: 55: 14 + 00: 00

Тебе все равно. Внутреннее представление - это деталь реализации, не связанная с вашей работой. И эта реализация может измениться в будущих версиях.

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

Все, что вам нужно, это документированное поведение , стандарт SQL и различие между ними.

В случае типов даты и времени стандарт SQL едва касается предмета, определяя несколько типов и определяя очень небольшое поведение. Таким образом, возможности баз данных варьируются широко .

Выдержки из документации MySQL:

Тип данных TIMESTAMP используется для значений, которые содержат как дату, так и время. У TIMESTAMP есть диапазон от «1970-01-01 00:00:01» UTC до «2038-01-19 03:14:07» UTC.

MySQL преобразует значения TIMESTAMP из текущего часового пояса в UTC для хранения и обратно из UTC в текущий часовой пояс для извлечения.

доля доли секунды с точностью до микросекунд (6 цифр)… отбрасывается

Y2038 Проблема

Если вам интересно узнать о реализации, посмотрите на исходный код.

Но даже не глядя на источник, после прочтения этой документации у нас есть две подсказки о типе TIMESTAMP:

  • Любая дробная секунда упала.
  • Верхний предел 2038-01-19T03: 14: 07Z.

Итак, мы знаем, что тип, вероятно, сохраняется как 32-битное число целых секунд с даты начала эпохи , обычно используемой в Unix и некоторых других системах: первый момент 1970 года в UTC, 1970- 01-01T00: 00Z. Такое 32-битное число достигнет своего максимума в эту дату, что явление известно в отрасли как Y2038 Проблема .

Если обработка даты и времени важна для вашего проекта, вы можете рассмотреть возможность использования базы данных с более надежной обработкой даты и времени, такой как Postgres .

Умные объекты, а не тупые нити

Вы должны использовать типы даты и времени на вашем языке программирования для обмена значениями даты и времени с вашей базой данных. Избегайте общения с простыми строками.

Лидером в этом отношении является инфраструктура java.time в Java 8 и более поздних версиях с резервным портом, доступным для Java 6 и 7.

OffsetDateTime odt = OffsetDateTime.now( ZoneOffset.UTC ) ;
Strin sql = "SELECT * FROM event_ WHERE when_ >= ? ;" ;
…
myPreparedStatement.setObject( 1 , odt ) ;

индексирование.

OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ; // In Postgres and some other databases, the offset-from-UTC will be zero, for UTC itself.
ZonedDateTime zdt = odt.atZoneSameInstant( ZoneId.of( "America/Montreal" ) ) ;  // Adjust from UTC into a time zone. Same moment, same point on the timeline, different wall-clock time.

И подтверждая мою точку зрения ... Амадан о другой ответ указывает на то, что представленная выше документация устарела, начиная с MySQL 5.5. Реализация претерпела радикальные изменения в Версии 8.

0 голосов
/ 08 ноября 2018

TIMESTAMP в MySQL - 4-байтовое целое число , представляющее секунды с начала UNIX (полночь 1970-01-01); в более новых версиях он расширяется для сохранения точности до 0-3 байта в зависимости от параметра fsp (дробная секунда точности) для типа данных.

Бонус: PostgreSQL имеет параметр времени компиляции, который определяет, будет ли TIMESTAMP сохраняться в виде секунд с полуночи 2000-01-01 в 8-байтовом целом числе или в плавающем числе двойной точности (EDIT) : очевидно, больше не доступен в новых версиях; спасибо, Василий Бурк).

Как вы говорите, сохранение меток времени в виде текста вряд ли эффективно. Кроме того, странность календаря прыгает от сложного к невыносимо сложному.

Обратите внимание, что выше примерно TIMESTAMP; другие типы даты / времени могут иметь разные представления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...