JavaRush /Курсы /SQL SELF /Текстовые типы данных: CHAR, VARCHAR...

Текстовые типы данных: CHAR, VARCHAR, TEXT

SQL SELF
15 уровень , 2 лекция
Открыта

Когда речь заходит о работе с текстовыми данными в PostgreSQL, у нас есть три главных героя: CHAR, VARCHAR и TEXT. Каждый из них имеет свои особенности, преимущества и нюансы. Давайте разбираться по порядку.

CHAR(n)

CHAR, или character, представляет собой строку фиксированной длины n. Если в строке данных будет меньше символов, чем указано, она автоматически дополняется пробелами.

Пример:

id code - CHAR(5)
1 ''ABC''

Этот тип удобно использовать, когда все строки должны быть одинаковой длины (например, коды, штрих-коды или идентификаторы фиксированной длины).

А вот в случае работы с текстом переменной длины дополняющие пробелы только зря занимают место в базе.

VARCHAR(n)

VARCHAR, или variable character, предназначен для хранения строк переменной длины с ограничением на максимум n символов.

Пример:

id username - VARCHAR(10)
1 ''Alice''

Этот тип эффективно использует место, так как сохраняет только фактический текст. А к недостаткам нужно отнести требование указания ограничения длины. Если строка превышает это ограничение, база данных выбросит ошибку.

TEXT

TEXT — это строчный тип данных, не имеющий ограничений по длине. Этот тип часто используется, когда вы не уверены, до какого размера может вырасти текст.

Пример:

id content - TEXT
1 ''This is a long piece of text. No limits!''

Преимущества: можно хранить тексты любой длины, не беспокоясь об ограничениях.

Недостатки: отсутствие ограничений может привести к неэффективному использованию базы данных, если текстовые данные начинают "раздуваться".

Сравнение текстовых типов данных

Когда вы работаете с текстом, важно понимать, какой тип данных подходит для конкретного случая. Вот основные различия между CHAR, VARCHAR и TEXT:

Тип данных Длина Производительность Когда использовать?
CHAR(n) Фиксированная Быстрее для фиксированной длины строк Для кодов фиксированной длины (например, ISO)
VARCHAR(n) Максимальная длина n Быстрее, чем TEXT, при ограничении длины Для переменной длины строк с известным максимумом
TEXT Неограниченная Наиболее универсален Для длинных текстов, объем которых трудно предсказать

Практические примеры использования

Итак, давайте проверим, как использовать эти типы данных в реальных сценариях.

Пример 1: Использование CHAR для кодов фиксированной длины

Представьте, что вы работаете с базой данных, где необходимо хранить коды городов по стандарту ISO 3166-1 alpha-3. Каждый код должен содержать строго 3 символа.

city_id city_name - VARCHAR(50) iso_code - CHAR(3)
1 New York NYC
2 Los Angeles LAX
3 Chicago CHI

Здесь CHAR(3) идеален, так как каждый ISO-код города строго фиксированной длины.

Пример 2: Использование VARCHAR для имен пользователей

Имя пользователя — это отличная область применения для VARCHAR. Обычно имя имеет переменную длину, но мы можем предположить, что оно точно не превысит 50 символов.

user_id username - VARCHAR(50) email - VARCHAR(50)
1 Alice alice@example.com
2 Bob bob@example.net

VARCHAR в данном случае экономит место, так как реальная длина строки может быть меньше 50 символов.

Пример 3: Использование TEXT для хранения описаний

Представьте, что у вас есть блог, где для каждого поста необходимо хранить большое текстовое описание. Здесь оптимальным выбором будет TEXT.

post_id title - VARCHAR(100) content - TEXT
1 Post 1 This is a very long blog post content that goes on and on...

Если вы никогда не знаете заранее, какова будет длина текста, TEXT подходит идеально.

4. Дополнительные нюансы и подводные камни

При работе с текстовыми типами данных есть некоторые аспекты, которые стоит учитывать, чтобы избежать типичных ошибок.

Проблема: CHAR добавляет пробелы

Если вы попытаетесь сравнить строки в поле типа CHAR без учета добавленных пробелов, это может привести к неожиданным результатам.

SELECT * FROM cities WHERE iso_code = 'NYC';
-- Ничего не вернется, если не убрать пробелы

Как исправить: Используйте функцию TRIM() для удаления пробелов.

SELECT * FROM cities WHERE TRIM(iso_code) = 'NYC';

Проблема: Ограничения длины в VARCHAR могут вызывать ошибки

Если вы попытаетесь вставить в поле типа VARCHAR строку, превышающую максимум, база данных выбросит ошибку.

INSERT INTO users (username, email) VALUES ('A_username_that_is_too_long_for_field', 'test@example.com');
-- Ошибка

Как исправить: Убедитесь, что ограничение длины (n) соответствует реальным потребностям. Либо используйте TEXT, чтобы избежать ограничений.

Проблема: TEXT может раздувать вашу базу

TEXT хранит неограниченные данные, что может привести к излишнему росту таблиц и усложнению индексации.

Как избежать: Если вы планируете активно индексировать столбец типа TEXT, рассмотрите возможность использования ограниченного VARCHAR.

2
Задача
SQL SELF, 15 уровень, 2 лекция
Недоступна
Приведение регистра и удаление пробелов
Приведение регистра и удаление пробелов
2
Задача
SQL SELF, 15 уровень, 2 лекция
Недоступна
Фильтрация по шаблону (LIKE)
Фильтрация по шаблону (LIKE)
Комментарии (2)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Анатолий Уровень 52
31 января 2026
❤️
27 июня 2025
В задаче по LIKE используйте вывод полей поименно, вместо звездочки