Ответ
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 эффективнее.