CHAR, VARCHAR и NVARCHAR (полки разных размеров)
Это три вида полок в одной камере хранения: делают одно дело (хранят текст), но у каждой свои правила по размеру и алфавиту.
На пальцах
Представь камеру хранения в отеле. Гость подходит сдать багаж — а размер полки зависит от того, какой тип ему выдадут.
CHAR — полка фиксированной ширины, скажем, ровно 50 см. Гость кладёт маленькую коробочку — остальные 40 см пустуют. Кладёт большой чемодан — всё равно 50 см, лишнее не поместится. Просто и предсказуемо, но место часто уходит впустую.
VARCHAR — полка-трансформер. Маленькая коробочка — занимает 10 см, большой чемодан — все 100 см. Растягивается точно под багаж, до заранее оговорённого предела.
NVARCHAR — такая же полка-трансформер, но принимает багаж с табличками на любом языке: кириллица, иероглифы, эмодзи. VARCHAR такой багаж может и не разобрать.
В базе данных то же самое: CHAR, VARCHAR и NVARCHAR — три способа выделить место под текст, и у каждого свой характер.
Что делает каждый
CHAR хранит текст фиксированной длины. Сколько символов ни ввели — под строку всегда отведено одно и то же место, остальное добивается пробелами.
VARCHAR хранит текст переменной длины. Сколько символов ввели — столько места и ушло, плюс небольшая служебная пометка с длиной.
NVARCHAR делает то же, что VARCHAR, но каждый символ хранится в универсальном формате Unicode, поэтому подходят любые алфавиты.
В чём разница
| CHAR | VARCHAR | NVARCHAR | |
|---|---|---|---|
| Размер | фиксированный, задаёшь при создании поля | подстраивается под содержимое | подстраивается под содержимое |
| Алфавит | один (зависит от базы) | один (зависит от базы) | любой (Unicode) |
| Пустое место при коротком тексте | да, добивается пробелами | нет | нет |
Что из этого следует
- Поле с известной длиной — например, двухбуквенный код страны («RU», «US») — бери CHAR. Размер всегда известен, лишние пробелы не мешают.
- Обычный текст на одном языке (только русский или только английский) — VARCHAR. Он проще и экономит место.
- Текст может содержать любые языки, эмодзи, редкие символы — NVARCHAR. Например, имя пользователя по-китайски, комментарий со смайликами или цены в разных валютах.