Какое побитовое представление у типа DATETIME(6)?
Согласно документации от разработчиков MariaDB:
1 bit sign (1= non-negative, 0= negative)
17 bits year*13+month (year 0-9999, month 0-12)
5 bits day (0-31)
5 bits hour (0-23)
6 bits minute (0-59)
6 bits second (0-59)
40 bits = 5 bytes
(Взято отсюда https://dev.mysql.com/doc/internals/en/date-and-time-data-type-representation.html)
- Не понимаю строчку про год-месяц. На месяц нужно 4 бита, тогда на год остаётся 13, но этого недостаточно для диапазона 0-9999. Поясните, пожалуйста.
- Далее в документации указано, что для хранения 6 цифр после запятой используются 3 байта — дробная часть секунды. Но для диапазона 0-999999 достаточно 20 бит, значит, где-то будет дырка в 4 бита или нули?
Подскажите, пожалуйста, представление или как мне его проверить. Нужно это для обработки в C++ коде, т.е. 8 байт передаются и хранятся просто в ULL, а дальше из них выделяются год, месяц и т.п.
Ответы (1 шт):
Не понимаю строчку про год-месяц. На месяц нужно 4 бита, тогда на год остаётся 13, но этого недостаточно для диапазона 0-9999. Поясните, пожалуйста.
Ну русским же по белому пишут: year*13+month
Т.е. от 0*13 + 0 = 0 и до 9999*13 + 12 = 129999. Вполне в 17 бит (0 - 131071) укладывается.
Далее в документации указано, что для хранения 6 цифр после запятой используются 3 байта — дробная часть секунды. Но для диапазона 0-999999 достаточно 20 бит
Может, там BCD, по 4 бита на цифру. А даже если и не BCD - всё равно оставшиеся 4 бита ни на что не пустить...