Ответ
CHAR и VARCHAR используются для хранения строк, но по-разному управляют памятью:
CHAR(n)— тип фиксированной длины. Если объявлен какCHAR(10), то под каждое значение всегда выделяется ровно 10 символов. Если строка короче, она дополняется пробелами справа. Это делает операции сравнения предсказуемыми и быстрыми.VARCHAR(n)— тип переменной длины. Выделяется ровно столько байт, сколько нужно для хранения строки, плюс небольшой служебный overhead (1-2 байта) для хранения информации о длине.VARCHAR(10)может хранить строку'abc', заняв ~4 байта.
Пример создания таблицы:
CREATE TABLE users (
country_code CHAR(2), -- Всегда 2 символа (например, 'RU', 'US')
phone_prefix CHAR(3), -- Всегда 3 символа (например, '495')
username VARCHAR(50), -- До 50 символов, хранится только фактическая длина
bio VARCHAR(500) -- Длинный текст переменной длины
);
Ключевые соображения для выбора:
- Используйте
CHARдля данных, длина которых строго постоянна (коды, флаги, хэши фиксированной длины). Это улучшает производительность и целостность данных. - Используйте
VARCHARдля данных с переменной длиной (имена, описания, emails). Это существенно экономит место на диске и в памяти. - В современных СУБД разница в скорости между
CHARиVARCHARдля большинства операций незначительна, поэтомуVARCHARчасто является более безопасным и гибким выбором по умолчанию.
Ответ 18+ 🔞
Ага, вот тебе на, опять эти ваши буквенные типы! Сидишь такой, думаешь — ну что там сложного, строки и строки. А нихуя! Тут целая философия, как водку с пивом мешать — можно, но потом охуеешь.
Так вот, смотри. Есть два главных героя: CHAR и VARCHAR. Первый — это такой зануда-педант, который всё по линейке отмеряет. Объявил ты ему CHAR(10) — и всё, блядь, он под каждую запись будет ровно десять символов выделять, будь там хоть одно слово. Не заполнил? Он тебя пробелами дохуя дополнит, чтоб было ровно! С ним операции сравнения быстрые, как удар током, всё предсказуемо.
А VARCHAR — это наш пофигист-оптимизатор. Сказал ему VARCHAR(10) — он кивнул, и хранит ровно столько, сколько ты ему скормил. Строка 'abc'? Пожалуйста, вот тебе 3 байта за символы, плюс парочка служебных на контроль длины — и все довольны. Экономия места — просто пиздец!
Вот тебе пример, как это в таблице выглядит:
CREATE TABLE users (
country_code CHAR(2), -- Вот тут чётко два символа: 'RU', 'US'. Ни больше, ни меньше.
phone_prefix CHAR(3), -- Три цифры, например '495'. Фиксированно, как гвоздь в стену.
username VARCHAR(50), -- Имя пользователя. Может быть 'Вася', а может 'Александр-Валерьевич'. Хранится сколько надо.
bio VARCHAR(500) -- Биография, где можно написать овердохуища текста, но не больше 500 символов.
);
А теперь главное — когда что тыкать:
CHAR— это когда длина жёстко зафиксирована, как галстук на корпоративе. Коды стран, всякие флаги, MD5-хэши (если, конечно, ты не в каменном веке). Целостность данных и скорость на первом месте.VARCHAR— это для всего переменного, что прыгает по длине. Имена, описания товаров, комментарии, почта. Экономит место на диске так, что твоя база не раздуется, как пузырь.- И да, не парься сильно насчёт производительности в современных системах. Разница часто — хуй с горы. Поэтому если сомневаешься — бери
VARCHAR, не прогадаешь. Гибче он, зараза.