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

«В чем разница между типами данных CHAR и VARCHAR в SQL?» — вопрос из категории Базы данных и SQL, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

CHAR и VARCHAR — строковые типы данных, но с разной стратегией хранения, что влияет на производительность и использование памяти.

CHAR(n) — строка фиксированной длины.

  • Всегда занимает ровно n символов в памяти/на диске.
  • Если строка короче, она дополняется пробелами справа (padding).
  • Быстрее для чтения/записи, если длина данных постоянна, из-за предсказуемости размера записи.

VARCHAR(n) — строка переменной длины.

  • Занимает столько места, сколько нужно для хранения строки + небольшие служебные данные (обычно 1-2 байта для хранения длины).
  • Пробелы в конце не добавляются и не обрезаются автоматически.
  • Экономит место на диске и в памяти для строк разной длины.

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

Действие CHAR(10) VARCHAR(10)
INSERT 'abc' Сохраняется как 'abc ' (7 пробелов). Сохраняется как 'abc' (3 символа + служебные байты).
SELECT LENGTH() Всегда возвращает 10. Возвращает 3 (фактическую длину).
Использование Коды (страны 'RU', 'US'), фиксированные форматы (номера ИНН). Имена, email, адреса, описания — где длина сильно варьируется.

Пример запроса:

CREATE TABLE users (
    country_code CHAR(2),      -- Всегда 2 символа
    username VARCHAR(50),      -- До 50 символов, занимает по факту
    bio VARCHAR(500)           -- Длинный текст переменной длины
);

INSERT INTO users VALUES 
    ('US', 'alice', 'Hello!'), -- CHAR дополнен пробелами, VARCHAR нет
    ('GB', 'bob_very_long_username', 'A long biography...');

Рекомендация: Используйте CHAR только для данных с гарантированно одинаковой длиной. Во всех остальных случаях VARCHAR эффективнее.