CHAR (N) , вероятно, является наиболее запутанным, потому что символ не является фиксированным размером байта в наборах символов.Кроме того, разные форматы строк по-разному решают эту проблему.Вкратце, если вы используете ROW_FORMAT = COMPACT, ROW_FORMAT = DYNAMIC или ROW_FORMAT = COMPRESSED, то CHAR (N) инвертирует минимум N байтов, чтобы получить обновления на месте без фрагментации.Если в результате другой кодировки символов требуется больше байтов, чем будет использоваться больше по мере необходимости, при этом старается использовать как можно меньше, и НЕТ БОЛЬШЕ, чем максимальная длина символа * N.Если вы используете ROW_FORMAT = REDUNDANT, то CHAR (N) всегда использует максимальную длину символа * N.
VARCHAR (N) и VARBINARY (N) устанавливает максимальную длину символана столбец N. Ниже N MySQL использует требуемое количество байтов с учетом используемой кодировки строки и символа.Затем MySQL использует один дополнительный байт для записи длины строки, если строка меньше 256 байтов.Если длина строки превышает 255 байтов, то для записи длины строки используются 2 байта.Столбцы VAR эффективны для хранения, но для строковых столбцов с частыми ОБНОВЛЕНИЯМИ можно обменять хранилище на производительность, используя столбец фиксированной длины, такой как BINARY.
Описание DECIMAL довольно самоочевидно: "Значения для столбцов DECIMAL (и NUMERIC) представлены в двоичном формате, который упаковывает девять десятичных (основание 10) цифр в четыре байта. Хранение для целой и дробной частей каждого значения определяется отдельно. Каждому кратному из девяти цифр требуется четыре байта,и для «оставшихся» цифр требуется некоторая доля в четыре байта. Для хранения избыточных цифр требуется следующая таблица «