Занимают ли столбцы char / varchar / text / longtext в MySQL полный размер в файловой системе даже для частично заполненных ячеек?

Столбцы varchar/text/longtext в MySQL занимают полный размер в файловой системе даже для неполных ячеек?

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

CHAR (72) - can store upto 72 characters - i put in a string "abcd"
VARCHAR (72) - can store upto 72 characters - i put in a string "abcd"
TINYTEXT - can store upto 255 characters - i put in a string "abcd"
TEXT - can store upto 65,535 characters - i put in a string "abcd"
LONGTEXT - can store upto 4,294,967,295 characters - i put in a string "abcd"

Сколько фактического физического пространства будет занимать каждый из этих столбцов для строки?

Полный размер, до которого может храниться каждый столбец?

Или столько, сколько требуется для хранения "abcd"?


person Rakib    schedule 28.03.2016    source источник


Ответы (1)


Ознакомьтесь с http://dev.mysql.com/doc/refman/5.7/en/string-type-overview.html

По сути, все эти типы, кроме CHAR, имеют переменную длину.

Например, если у вас есть VARCHAR(72) и вы записываете в него abcd, вы сохраните 5 байт. 4 байта для каждого символа и 1-байтовый префикс для хранения длины строки (равной 4).

Если длина строки превышает 255 символов, то префикс VARCHAR будет равен 2 байтам. Таким образом, VARCHAR(300) с хранящейся в нем строкой из 256 символов займет 258 байт.

TINYTEXT всегда имеет 1-байтовый префикс, потому что в нем можно хранить только 255 символов, поэтому abcd займет 5 байт.

TEXT имеет 2-байтовый префикс, поэтому abcd будет 6-байтовым.

LONGTEXT имеет 4-байтовый префикс, поэтому abcd будет 8-байтовым.

Наконец, почти бесполезный тип CHAR. CHAR(72) всегда будет занимать 72 байта независимо от того, что вы в нем храните. Это действительно полезно только для очень коротких полей, где всегда есть одинаковое количество символов в поле. Например, Y или N были бы хорошими кандидатами на CHAR(1).

person JNevill    schedule 28.03.2016