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

Ответ

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

Ключевые отличия

Аспект CHAR(10) VARCHAR(10)
Хранение Всегда занимает фиксированные 10 байт (или символов, в зависимости от кодировки). Если строка короче, она дополняется пробелами справа. Занимает переменный объем: длина строки + 1-2 байта на служебную информацию о длине.
Производительность Быстрее для чтения и сравнения при работе со строками фиксированной длины, так как предсказуемый размер упрощает вычисления. Эффективнее использует память/дисковое пространство для строк переменной длины.
Сравнение При сравнении дополняющие пробелы обычно игнорируются. Сравнивается точно, пробелы учитываются.

Пример и рекомендации

CREATE TABLE Example (
    fixed_col CHAR(10),
    variable_col VARCHAR(10)
);

INSERT INTO Example VALUES ('abc', 'abc');
-- 'abc' в fixed_col будет храниться как 'abc       ' (7 пробелов).
-- 'abc' в variable_col займет ~4 байта (3 символа + 1 байт на длину).

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

  • CHAR — для данных с гарантированно одинаковой длиной (коды стран, пол, хэши фиксированной длины).
  • VARCHAR — для данных с переменной длиной (имена, адреса, описания).

Ответ 18+ 🔞

Да ты посмотри, какая дичь! Два типа, вроде одно и то же — строки хранить, а под капотом, блядь, разница как между молотком и микроскопом.

Вот смотри, CHAR(10) — это такой зануда-перфекционист. Сказал десять байт — значит, блядь, десять, ни байтом меньше. Запишешь ты туда 'abc', а он тебе его, сука, пробелами до ушей набьёт, чтоб ровно десять было: 'abc '. Место на диске жрёт фиксированно, как удав кролика. Зато, когда его читать — всё предсказуемо, адрес памяти посчитал и сразу прыгнул, без лишних телодвижений.

А VARCHAR(10) — хитрая жопа экономная. Ему похуй на идеалы, он прагматик. Сказал 'abc' — он и сохранит три символа, да ещё пару байтов сверху на бумажку прилепит, где длину записал. Места занимает ровно столько, сколько надо. Но за это удобство платишь скоростью: чтобы его прочитать, надо сначала эту бумажку с длиной найти, вычислить, где он кончается... В общем, возни больше.

Короче, ёпта:

  • CHAR — для всего, что как солдаты на параде, одинаковой длины: коды ('RU', 'M'), всякие фиксированные номера.
  • VARCHAR — для всего живого и разного: имена, адреса, анекдоты про тещу. Тут экономия места важнее.
CREATE TABLE Example (
    fixed_col CHAR(10),   -- Здесь 'yes' превратится в 'yes      '
    variable_col VARCHAR(10) -- А здесь останется скромным 'yes'
);

Вывод, блядь, простой: не тыкай CHAR куда попало, а то места проёбывать начнёшь, как последний распиздяй. Для большинства человеческих данных — VARCHAR твой бронепоезд.