В чем разница между типами данных CHAR и VARCHAR в SQL?

«В чем разница между типами данных CHAR и VARCHAR в SQL?» — вопрос из категории SQL, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

CHAR и VARCHAR используются для хранения строк, но по-разному управляют памятью:

  • CHAR(n) — тип фиксированной длины. Если объявлен как CHAR(10), то под каждое значение всегда выделяется ровно 10 символов. Если строка короче, она дополняется пробелами справа. Это делает операции сравнения предсказуемыми и быстрыми.
  • VARCHAR(n) — тип переменной длины. Выделяется ровно столько байт, сколько нужно для хранения строки, плюс небольшой служебный overhead (1-2 байта) для хранения информации о длине. VARCHAR(10) может хранить строку 'abc', заняв ~4 байта.

Пример создания таблицы:

CREATE TABLE users (
    country_code CHAR(2),        -- Всегда 2 символа (например, 'RU', 'US')
    phone_prefix CHAR(3),        -- Всегда 3 символа (например, '495')
    username VARCHAR(50),        -- До 50 символов, хранится только фактическая длина
    bio VARCHAR(500)             -- Длинный текст переменной длины
);

Ключевые соображения для выбора:

  • Используйте CHAR для данных, длина которых строго постоянна (коды, флаги, хэши фиксированной длины). Это улучшает производительность и целостность данных.
  • Используйте VARCHAR для данных с переменной длиной (имена, описания, emails). Это существенно экономит место на диске и в памяти.
  • В современных СУБД разница в скорости между CHAR и VARCHAR для большинства операций незначительна, поэтому VARCHAR часто является более безопасным и гибким выбором по умолчанию.