← Назад к вопросам

В чем разница между char и varchar в SQL?

1.3 Junior🔥 61 комментариев
#SQL и базы данных

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI28 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Разница между CHAR и VARCHAR в SQL

Основное различие

CHAR и VARCHAR — это два строковых типа данных в SQL, которые различаются способом хранения и использования памяти. CHAR хранит строку с фиксированной длиной, а VARCHAR — с переменной длиной.

CHAR (Character)

CHAR — это тип данных фиксированной длины. Если вы объявляете CHAR(10), то каждое значение будет занимать ровно 10 символов, независимо от того, сколько символов вы фактически используете.

Пример:

CREATE TABLE users (
    id INT PRIMARY KEY,
    gender CHAR(1),  -- F или M
    country_code CHAR(2)  -- US, UK, RU и т.д.
);

INSERT INTO users VALUES (1, 'M', 'US');
INSERT INTO users VALUES (2, 'F', 'UK');

Характеристики CHAR:

  • Фиксированная длина: всегда занимает полный размер
  • Дополнение: если строка короче объявленной длины, она дополняется пробелами
  • Быстрый поиск: фиксированный размер позволяет быстро найти позицию в индексе
  • Расход памяти: потенциально больше для коротких строк
  • Производительность: быстрее для операций сравнения

VARCHAR (Variable Character)

VARCHAR — это тип данных переменной длины. Вы указываете максимальную длину, но фактически хранится только необходимое количество символов плюс служебные байты для хранения длины.

Пример:

CREATE TABLE products (
    id INT PRIMARY KEY,
    name VARCHAR(255),  -- максимум 255 символов
    description VARCHAR(1000)
);

INSERT INTO products VALUES (1, 'Ноутбук', 'Мощный ноутбук для работы');
INSERT INTO products VALUES (2, 'Мышь', 'Беспроводная мышь');

Характеристики VARCHAR:

  • Переменная длина: занимает столько памяти, сколько нужно
  • Без дополнения: не заполняется пробелами
  • Экономия памяти: меньше памяти для коротких строк
  • Гибкость: можно хранить строки разной длины
  • Производительность: немного медленнее для операций сравнения

Практическое сравнение

-- CHAR(10)
CREATE TABLE test_char (
    id INT,
    value CHAR(10)
);
INSERT INTO test_char VALUES (1, 'ABC');      -- занимает 10 байт
INSERT INTO test_char VALUES (2, 'ABCDEFGHIJ'); -- занимает 10 байт

-- VARCHAR(10)
CREATE TABLE test_varchar (
    id INT,
    value VARCHAR(10)
);
INSERT INTO test_varchar VALUES (1, 'ABC');      -- занимает 3 байта + 1-2 служебных
INSERT INTO test_varchar VALUES (2, 'ABCDEFGHIJ'); -- занимает 10 байт + 1-2 служебных

Сравнительная таблица

АспектCHARVARCHAR
ДлинаФиксированнаяПеременная
ОбъявлениеCHAR(n)VARCHAR(n)
ДополнениеПробелами слеваНе дополняется
Память для "ABC" (max 10)10 байт4 байта (3 + служебные)
Память для "ABCDEFGHIJ" (max 10)10 байт10 байт + служебные
ПоискБыстрееНемного медленнее
СравнениеБолее эффективноМенее эффективно
Использование дискового пространстваБольше для коротких строкМеньше в большинстве случаев
Лучше дляФиксированные значенияПеременные текстовые поля

Когда использовать что?

CHAR:

  • Коды и идентификаторы фиксированной длины (страны, коды штатов, gender)
  • Гарантированная фиксированная длина (ISBN, ГОСТ и т.д.)
  • Небольшие строки (1-4 символа), где все значения почти одинаковой длины
  • Когда требуется высокая скорость поиска и сравнения

VARCHAR:

  • Текстовые поля переменной длины (имена, адреса, описания)
  • Когда длины данных значительно варьируются
  • Большинство практических приложений
  • Когда важна экономия памяти

Пример из практики Data Science

-- Хорошие примеры CHAR
CREATE TABLE customers (
    id INT PRIMARY KEY,
    gender CHAR(1),          -- M или F
    country_code CHAR(2),    -- ISO 3166-1 alpha-2
    status CHAR(1)           -- A (Active), I (Inactive)
);

-- Хорошие примеры VARCHAR
CREATE TABLE orders (
    id INT PRIMARY KEY,
    customer_name VARCHAR(100),
    product_name VARCHAR(255),
    address VARCHAR(500),
    notes VARCHAR(2000)
);

Совет для производительности

При работе с большими датасетами для анализа обратите внимание:

  • CHAR индексы более эффективны для точного совпадения
  • VARCHAR экономит дисковое пространство и I/O для больших таблиц
  • Для TEXT полей лучше использовать VARCHAR или TEXT (без ограничения длины)

В современных системах VARCHAR часто предпочтительнее, так как дисковое пространство дешево, а гибкость важна.