В хранилище VARCHAR(255)
достаточно умен, чтобы хранить только нужную вам длину в данном ряду, в отличие от CHAR(255)
, который всегда будет хранить 255 символов.
Но так как вы пометили этот вопрос MySQL, я упомяну специфический для MySQL совет: поскольку строки копируются из уровня механизма хранения в уровень SQL, поля VARCHAR
преобразуются в CHAR
, чтобы получить преимущество работы со строками фиксированной ширины. Таким образом, строки в памяти становятся дополненными до максимальной длины вашего объявленного столбца VARCHAR
.
Когда ваш запрос неявно генерирует временную таблицу, например, при сортировке или GROUP BY
, это может занять много памяти. Если вы используете много полей VARCHAR(255)
для данных, которые не должны быть такими длинными, это может сделать временную таблицу очень большой.
Вам также может быть интересно знать, что это поведение "заполнения" означает, что строка, объявленная с набором символов utf8, дополняет до трех байтов на символ, даже для строк, которые вы храните с однобайтовым содержимым (например, символы ascii или latin1) , И также набор символов utf8mb4 заставляет строку заполнять до четырех байтов на символ в памяти.
Таким образом, VARCHAR(255)
в utf8, хранящем короткую строку типа «Нет мнения», занимает 11 байт на диске (десять символов младшей кодировки, плюс один байт в длину), но занимает 765 байт в памяти и, следовательно, во временных таблицах или отсортированные результаты.
Я помог пользователям MySQL, которые по незнанию часто создавали временные таблицы 1,5 ГБ и заполняли свое дисковое пространство. У них было много VARCHAR(255)
столбцов, которые на практике хранили очень короткие строки.
Лучше всего определять столбец на основе типа данных, которые вы намереваетесь хранить. У него есть преимущества для обеспечения ограничений, связанных с приложением, как уже упоминали другие люди. Но он имеет физические преимущества во избежание потери памяти, описанной выше.
Трудно понять, какой самый длинный почтовый адрес, конечно, поэтому многие люди выбирают длинный VARCHAR
, который, безусловно, длиннее любого адреса. И 255 является обычным, потому что это максимальная длина VARCHAR
, для которой длина может быть закодирована одним байтом. Это была также максимальная длина VARCHAR
в MySQL старше 5.0.