Почему MySql DATETIME занимает 8 байтов вместо 6 байтов?

дата MySql занимает 3 байта, а время занимает 3 байта, но DATETIME занимает 8 байтов. Я предполагаю, что это должно быть 6 байтов (3+3) вместо 8 байтов. Какова логика этого и почему используются дополнительные два байта?

1 ответов


согласно MySQL internals документация, это необходимо из-за специфических требований к хранению:

+-----------+------------------------+---------------------+
|   YEAR    | 1 byte, little endian  |      Unchanged      |
+-----------+------------------------+---------------------+
|   DATE    | 3 bytes, little endian |      Unchanged      |
+-----------+------------------------+---------------------+
|           |                        | 3 bytes +           |
|   TIME    | 3 bytes, little endian | fractional-seconds  |
|           |                        | storage, big endian |
+-----------+------------------------+---------------------+
|           |                        | 4 bytes +           |
| TIMESTAMP | 4 bytes, little endian | fractional-seconds  |
|           |                        | storage, big endian |
+-----------+------------------------+---------------------+
|           |                        | 5 bytes +           |
| DATETIME  | 8 bytes, little endian | fractional-seconds  |
|           |                        | storage, big endian |
+-----------+------------------------+---------------------+

в частности, DATETIME имеет 8 байт:

  • 4 байта: целое число для даты, представленной как YYYY×10000 + MM×100 + DD
  • 4 байта: целое число для времени, представленное как HH×10000 + MM×100 + SS

поэтому важно понимать, что выходное представление и представление хранилища-это две очень разные вещи. Как видите, структура для datetime-это два целых числа с некоторыми внутренними вычислениями для обеих частей-даты и времени.