- 17 октября 2026
- 10 минут
- 3
Статью подготовили специалисты образовательного сервиса Zaochnik.
Тип данных VARCHAR
Тип данных VARCHAR представляет собой символьный тип с переменной длиной строки. Его основное назначение – хранение текстовой информации, объем которой варьируется от 1 до 65535 байт в зависимости от системы управления базами данных и конкретных настроек. В ряде современных СУБД максимальная длина VARCHAR может достигать 65535 символов, но ограничена внутренним буфером записи и кодировкой символов.
Тип данных VARCHAR – это символьный тип данных переменной длины, используемый для хранения текстовой информации в базах данных.
Различия между CHAR и VARCHAR
Типы данных CHAR и VARCHAR часто применяются для хранения текстовых данных, но имеют принципиально разные механизмы. CHAR – это тип фиксированной длины, изменяющийся от 1 до 255 символов в большинстве СУБД MySQL (некоторые версии позволяют 0). При сохранении значения типа CHAR длина строки дополняется пробелами справа до заданного размера. При извлечении этих значений пробелы справа обрезаются, что обеспечивает одинаковый вид возвращаемых данных вне зависимости от исходной длины строки.
В противоположность CHAR, VARCHAR хранит строки переменной длины. Длина значения VARCHAR ограничивается 65535 байтами, но зависит от кодировки символов. Для хранения длины строки VARCHAR резервирует 1 или 2 байта (1 байт для строк длиной до 255 символов и 2 байта для более длинных). Значения VARCHAR не дополняются пробелами, что экономит объем хранимых данных и ускоряет работу с ними в случае переменных по длине строк.
При вводе значения, превышающего максимальную длину столбца CHAR или VARCHAR, происходит автоматическое усечение строки до максимально допустимого размера. Это может приводить к потере данных без явного уведомления, если не установлен соответствующий режим обработки ошибок или предупреждений в СУБД.
При усечении строки в столбцах CHAR и VARCHAR происходит немедленная обрезка данных без сохранения части, превышающей ограничение. В некоторых СУБД возможно включение режимов строгой проверки для генерирования ошибок в таких случаях.
На практике, для строк с постоянной длиной используют CHAR, а для переменных – VARCHAR. Пример: значение "abc" в CHAR(4) сохраняется как "abc " (с пробелом справа). При извлечении пробелы убираются, поэтому результат при чтении совпадает с VARCHAR(4), где сохраняется ровно "abc".
В столбце CHAR(4) строка "abc" сохраняется с добавлением пробела, а в VARCHAR(4) – без него. При выборке из БД обе вернут "abc".
Механизм хранения и ограничений VARCHAR
VARCHAR хранит свои данные в виде длины строки плюс собственно символы без какого-либо дополнительного заполнения. Максимальная длина VARCHAR зависит от используемой кодировки символов: например, UTF-8 может занимать до 3 байт на символ, поэтому реальное число символов в VARCHAR(65535) меньше при использовании многобайтовых кодировок.
Размер хранимых данных вычисляется как длина строки плюс служебные байты (1 или 2) для хранения длины. При превышении лимита максимального размера происходит усечение, что может привести к искажению информации. Длина ограничена техническими параметрами СУБД.
Так, в MySQL в таблицах типа InnoDB общая максимальная длина для всей строки не должна превышать 65535 байт с учетом всех столбцов. При этом размер отдельных VARCHAR-столбцов ограничен именно этой общей длиной и дополнительными метаданными, что всегда стоит учитывать при проектировании схемы базы данных.
Максимальная длина столбцов типа VARCHAR в MySQL ограничена 65535 байт общим размером строки в таблице. При использовании многобайтовой кодировки UTF-8 реальное число символов сокращается пропорционально.
Отличия VARCHAR от других символьных типов
Кроме VARCHAR и CHAR, существуют типы данных TEXT, ENUM и SET, которые тоже используются для хранения символьной информации, но имеют иные особенности механики и ограничений.
TEXT и BLOB относятся к типам больших объемов данных для хранения текста и двоичных данных соответственно. Они имеют четыре разновидности различающиеся максимальным размером: TINYTEXT/BLOB (до 255 байт), TEXT/BLOB (до 65 535 байт), MEDIUMTEXT/BLOB (до 16 Мб) и LONGTEXT/BLOB (до 4 Гб). TEXT занимает объем памяти пропорционально содержимому плюс битовая накладная.
Основное отличие VARCHAR от TEXT – непосредственное хранение в строках таблиц, тогда как TEXT часто хранится в отдельных областях с отсылками в основной записи. Это влияет на скорость доступа и ограничения.
Таблица сравнения ограничений типов VARCHAR и TEXT
В таблице приведены максимальные размеры, тип хранения и особенности работы для одних из самых популярных СУБД (MySQL версии 5.7 и выше).
| Тип данных | Максимальный размер (байты) | Тип хранения | Особенности |
|---|---|---|---|
| VARCHAR | До 65 535 (в общей длине строки) | Строка за строкой (inline) | Переменная длина, 1-2 байта на длину, ограничено общей длиной строки |
| TINYTEXT | 255 | Отдельное хранение | Поддержка индексации до 255 байт |
| TEXT | 65 535 | Отдельное хранение | Ограничение на индексируемую часть до 767 байт (MySQL до 5.7) |
| MEDIUMTEXT | 16 777 215 | Отдельное хранение | Увеличен объем, применяется для больших текстов |
| LONGTEXT | 4 294 967 295 | Отдельное хранение | Поддерживает очень большие тексты |
На понимание механики хранения влияет также способ индексирования. VARCHAR позволяет индексировать столбцы целиком, если их длина не превышает индексный лимит (обычно 767 байт для InnoDB в MySQL 5.7). Для TEXT лимиты жестче, индексируется только префикс, что снижает производительность запросов с фильтрами по таким столбцам.
Типы данных ENUM и SET как альтернативы VARCHAR
В ряде случаев для хранения ограниченных множеств строк используют типы ENUM и SET. ENUM представляет собой тип с фиксированным списком значений (от 1 до 65535 элементов в зависимости от СУБД). Хранение реализуется под капотом как целочисленный индекс, что позволяет оптимизировать запросы и экономить место.
Если при вставке в столбец ENUM передается строка, не входящая в список допустимых значений, запись заменяется пустой строкой, что интерпретируется как ошибочное значение. При этом в некоторых конфигурациях СУБД возможно фиксирование ошибок на уровне сервера. Вероятно, NULL также можно разрешить как значение ENUM, если это указано.
Тип SET принимает несколько значений из заданного списка (до 64 элементов). Внутри хранения реализован как битовая маска 64-битного целого числа, где каждый бит соответствует элементу множества. Это существенно сокращает объем по сравнению с VARCHAR, если множество элементов и варианты комбинаций ограничены.
Передача неверного значения в SET приводит к игнорированию таких элементов при сохранении. При сортировках и поисках используются числовые представления, что упрощает работу с множествами. Для доступа к значениям применяются функции FIND_IN_SET() и операторы LIKE, обеспечивающие гибкие варианты выборки.
Столбец SET с элементами "белый" и "синий" может принять пустую строку, "белый", "синий" или комбинацию "белый, синий". При попытке добавить "красный" значение игнорируется.
Тип VARCHAR и его практические ограничения
В ряде случаев рекомендуется использовать VARCHAR с длиной до нескольких тысяч символов для гибкости. При превышении определенной длины рекомендуется рассчитать, не будет ли выгоднее использовать TEXT по ряду факторов: объем памяти, возможности индексирования и производительность.
Следует учитывать, что на больших объемах данных VARCHAR требует дополнительного места для хранения длины и накладных структур. Дополнительно, ввиду особенностей кэширования данных, очень длинные строки могут ухудшать эффективность запросов.
Использование VARCHAR целесообразно, если предполагается варьирование длины текстов, не превышающей лимитов системы. Для полей с постоянной длиной лучше выбирать CHAR, а для неограниченных – TEXT (с учётом ограничений индексов).
Матрица выбора типов символьных данных
Ниже приведена матрица условий, которая поможет выбрать наиболее подходящий тип данных в зависимости от требований:
- Если длина строк фиксирована и не превышает 255 символов – выбрать CHAR. Недостаток – фиксированный размер на диске.
- Если строки имеют переменную длину до 65 535 байт и требуется быстрый доступ – использовать VARCHAR. Ограничение – суммарная длина всех полей в строке не должна превышать 65 535 байт.
- Для хранения больших объемов текста (от 65 КБ и выше), где поиск по содержимому не требуется – выбрать типы TEXT или BLOB. Недостаток – ограниченная индексируемая длина и отдельное хранение.
- Если требуется ограниченный набор фиксированных значений – применить ENUM, что уменьшает затраты на пространство и ускоряет выборки.
- Для множественного выбора из фиксированного набора – использовать SET с до 64 элементов. Преимущество – экономия места и высокая производительность. Ограничение – нельзя хранить значения с запятыми внутри элементов.
При использовании VARCHAR стоит контролировать максимальный размер поля для соответствия ограничениям СУБД и учитывать стоимость хранения с учётом кодировки символов.