MySQL InnoDB DECIMAL - размер данных определяется объявлением столбца или фактическими данными? - PullRequest
1 голос
/ 06 февраля 2012

Я использую MySQL, все мои таблицы используют движок InnoDB. У меня есть несколько столбцов, объявленных как DECIMAL (38, 0), и они широко используются. Согласно документации MySQL (http://dev.mysql.com/doc/refman/5.5/en/storage-requirements.html), 38-значное значение требует 17 байтов (38 = 4 * 9 + 2; 4 * 4 + 1 = 17). Хорошо.

Но значит ли это, что любое значение, хранящееся в этом столбце, займет 17 байт? Например, для значения 432 - будет ли оно занимать только 4 байта (я очень на это надеюсь ...) или оно все равно будет занимать 17 байтов?

Наконец, я знаю, что в Oracle занимаемый размер зависит от фактических сохраненных значений. Но так ли это оптимизировано и в MySQL?

Ответы [ 2 ]

2 голосов
/ 06 февраля 2012

Я думаю, что ответ таков: в любом случае это займет 17 байт. Если вы заметили, что подробно описано на связанной странице справочника, у СУБД нет возможности записать, насколько «длинным» является значение. Для сравнения, для столбца VARCHAR(255) CHARACTER SET ascii в начале значения есть один байт, который указывает, как долго это значение (для максимального размера 256 байтов). Для столбца VARCHAR(1000) CHARACTER SET ascii есть два байта для указания длины. Здесь нет подробных сведений о том, как записывать длину значения, что приводит меня к выводу, что столбец всегда занимает максимальный объем пространства.

1 голос
/ 06 февраля 2012

Десятичное число - это «фиксированная длина», поэтому для каждого значения требуется 17 байт.

...