Как MySQL хранит перечисления?

Если у меня есть такая таблица:

CREATE TABLE sizes (
    name ENUM('small', 'medium', 'large')
);

Будет ли MySQL хранить эти строки в каждой строке, или внутри он будет использовать что-то меньшее, например целые числа, чтобы знать, на какое значение перечисления ссылаться?

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


person Greg    schedule 03.11.2008    source источник


Ответы (3)


Он преобразует их в целые числа при INSERT/UPDATE и обратно в строки при SELECT, поэтому внутреннее хранилище представляет собой целые числа, но вы не подвергаетесь этому.

Вы можете получить целое число, например SELECT mycolumn + 0.

См. ENUM в MySQL 5.

person Greg    schedule 03.11.2008

Как объясняется здесь, перечисления хранятся в виде значений от 0 ( допустимое значение не задано) и 65 535, которые связаны с индексом перечисления. Значение, хранящееся в таблице, представляет собой 2-байтовое значение, а не строку.

person Robert Gamble    schedule 03.11.2008
comment
Я должен добавить, что если количество перечислений 255 или меньше, используется только 1 байт (аналогично TINYINT). (ссылка: документы mysql5) - person Sina; 14.12.2013

Во-первых, я бы не беспокоился о потреблении места, когда решал, использовать перечисление или нет. Место на диске много и дешево.

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

person Noah Goodrich    schedule 03.11.2008
comment
Это не только пространство, но и скорость. Получение меньшей строки выполняется быстрее, и я предпочитаю ПРИСОЕДИНЯТЬСЯ к перечислению, а не к строке. - person Greg; 03.11.2008
comment
нет, если только это не посредственное приложение, иначе я полностью не согласен с вашим первым абзацем - person Pacerier; 06.07.2011