@immelnikoff
Изучаю БД

Почему в MySQL8 тип DECIMAL неупакованный?

CREATE TABLE test (
   price DECIMAL(13,6) NOT NULL
 ) ENGINE=InnoDB DEFAULT CHARSET=cp1251;

INSERT INTO test VALUE(9999999.999999);
 
SELECT length(price) FROM test WHERE price = 9999999.999999;

Output: 14
Как можно видеть размер данного поля равен 14 байтам, то есть на одну цифру (включая точку) отводится по 1 байту. Хотя в документации написано, что в MySQL 8 тип DECIMAL является упакованным, то есть целая и дробная часть хранятся как целые числа. То есть данное поле должно весить 3 + 3 = 6 байт (2^24 = 16 777 216).
Может есть какой-то режим?
  • Вопрос задан
  • 95 просмотров
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Во-первых, упаковка там несколько другая. Каждые полная девятка цифр занимает четыре байта, неполная меньше (есть таблица). Целая и дробная части упаковываются отдельно. Ваш формат 13,6 должен занимать 7 байт.
https://dev.mysql.com/doc/refman/8.0/en/precision-...

Во-вторых, функция LENGTH принимает на вход строку, так что значение DECIMAL приводится к строке, отсюда и 14 символов.
https://dev.mysql.com/doc/refman/8.0/en/string-fun...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы