Одно предостережение относительно использования char вместо varchar в том, что набор символов влияет на пространство, которое должно быть выделено. Например, если для этого столбца используется набор символов utf8, возможно, для хранения одного символа потребуется 3 байта.
Поскольку столбец char приводит к выделению фиксированного размера независимо от того, что хранится, база данных должна соответствовать наихудшему случаю. Таким образом, MySQL всегда должен выделять 15 байтов на строку для этого столбца char (5), даже если вы на самом деле храните только 5 однобайтовых символов в каждой строке.
varchar использует только то, что необходимо для каждой строки, так как он хранится, поэтому те же самые 5 однобайтовых символов занимают всего 6 или 7 байтов. Один или два дополнительных байта предназначены для отслеживания фактической длины. Для varchar шириной до 255 в однобайтовом наборе символов MySQL должен выделить только 1 байт для хранения фактической ширины. Varchar шириной от 256 до 65 535 требуется 2 байта для хранения длины, принимая однобайтовый набор символов.
Поскольку для utf8 varchar (255) может потребоваться 255 * 3 байта памяти, MySQL должен выделить 2 байта для хранения длины. Большая часть этой информации описана в документации по MySQL здесь .
Хотя вы можете объявить ширину 65 535, максимальный эффективный размер в байтах составляет 65 532. Однако, в зависимости от набора символов и символов, которые вы храните, вы можете хранить не более, чем много многобайтовых символов.
Однако, как указывает Пол, вы все равно можете использовать символ, если это позволит фиксировать ширину всего ряда. Помимо прочего, некоторые поиски могут быть быстрее (например, пропустить первые 1000 строк) из-за фиксированного смещения.
Существуют также проблемы с производительностью, которые необходимо учитывать при обновлении столбца. Если у вас есть char (5) и вы начинаете с 1 символа, а затем обновляете значение до 5 символов, строка может быть обновлена на месте. При использовании varchar, в зависимости от реализации механизма хранения, может потребоваться перезапись всей строки в новом месте.
Наконец, если MySQL необходимо создать временную таблицу в памяти для сортировки набора результатов из вашей постоянной таблицы, он использует записи фиксированной длины. Таким образом, он выделяет намного больше места в памяти для этих негабаритных столбцов varchar, чем вы могли подумать. Это описано в документации по MySQL для таблиц подсистемы хранения памяти. Я считаю, что MySQL также делает это для дисковых сортировок.