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

Ответ

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

Ответ 18+ 🔞

Давай разберёмся с этими двумя типами, а то народ постоянно нихуя не понимает и потом удивляется, почему база тормозит как в говне.

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

CHAR(n) — это строгость и порядок, блядь.

  • Он всегда, сука, занимает ровно n символов. Не меньше, не больше. Как солдат в строю.
  • Записал ты туда слово "abc"? А он тебе его дополняет пробелами до нужной длины, вот так: 'abc '. Просто потому что может, епта.
  • Зато быстрее, если длина данных всегда одинаковая. Компьютер знает точно, где что искать, не надо голову ломать.

VARCHAR(n) — это рациональность и экономия.

  • Он занимает ровно столько места, сколько нужно твоей строке, плюс пару байтов служебных (чтобы помнить, какая длина).
  • Записал "abc"? Он и сохранит "abc". Никаких лишних пробелов, никакого паддинга. Честно.
  • Место экономит знатно, особенно если у тебя данные разной длины. Это его главный козырь.

Короче, таблица для наглядности, а то словами долго:

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

Пример, чтобы вообще всё стало ясно:

CREATE TABLE users (
    country_code CHAR(2),      -- Код страны — всегда два символа. Идеально для CHAR.
    username VARCHAR(50),      -- Имя пользователя — кто-то 'alice', а кто-то 'xX_Программист_1991_Xx'. VARCHAR рулит.
    bio VARCHAR(500)           -- Биография. Тут и говорить нечего — однозначно VARCHAR, ибо текст.
);

INSERT INTO users VALUES 
    ('US', 'alice', 'Hello!'), -- 'US' дополнен до 2 символов (хотя он и так 2), а 'alice' и 'Hello!' сохранены как есть.
    ('GB', 'bob_very_long_username', 'A long biography...');

Итоговая рекомендация, блядь: Не умничай. Если данные ВСЕГДА одной и той же, блять, длины — бери CHAR. Во всех остальных, ебать, 99.9% случаев — смело суёшь VARCHAR и не паришься. Сэкономишь кучу места и не будешь потом удивляться, почему у тебя в CHAR(255) хранится логин из трёх букв и 252 пробела.