Урок 1.4 · Время чтения: ~8 мин
Типы данных задают, какие значения может хранить каждый столбец таблицы. В этом уроке вы познакомитесь с основными типами данных SQL, поймёте, когда использовать каждый из них, и научитесь выбирать тип так, чтобы улучшить качество данных, эффективность хранения и производительность запросов.
В предыдущем уроке мы разобрали таблицы, ключи, ограничения и ACID. Теперь перейдём к практическому вопросу проектирования: какой тип данных назначить каждому столбцу.

Перед тем как разбирать подтипы, выделим основные группы типов данных в SQL:
TINYINT, INT, BIGINT, DECIMAL, FLOATCHAR, VARCHAR, TEXTDATE, TIME, DATETIME, TIMESTAMPBOOLEAN, BLOB, JSONЧисловые типы хранят числа, но разные задачи требуют разных типов. На практике обычно выбирают между:
Целочисленные типы хранят значения без дробной части.
| Тип | Типичный размер | Примерный диапазон (со знаком) |
|---|---|---|
TINYINT | 1 байт | от -128 до 127 |
SMALLINT | 2 байта | от -32 768 до 32 767 |
INTEGER / INT | 4 байта | от -2 147 483 648 до 2 147 483 647 |
BIGINT | 8 байт | от -9 223 372 036 854 775 808 до 9 223 372 036 854 775 807 |
Точные границы могут немного отличаться в зависимости от СУБД и поддержки unsigned.
DECIMAL хранит точные значения с фиксированной точностью.
DECIMAL(p, s) означает:p — общее число цифр,s — количество цифр после запятой.DECIMAL(10, 2) поддерживает значения до 99 999 999.99.Типы с плавающей точкой хранят приблизительные значения.
DOUBLE обычно точнее, чем FLOAT.Текстовые типы различаются главным образом поведением длины и хранения.
CHAR(10) всегда резервирует 10 символов.VARCHAR(255) хранит только фактически введённые символы.Временные типы нужно использовать везде, где вы храните дату, время или метку события.
Хранит только дату (год, месяц, день).
Хранит только время (часы, минуты, секунды).
Хранит дату и время вместе.
В некоторых системах TIMESTAMP связан с часовыми поясами, а DATETIME хранится как «локальное» значение без семантики часового пояса. Это важно проверять до проектирования таблиц аудита и событий.
Во многих реляционных СУБД есть дополнительные специализированные типы:
BOOLEAN — логические значения true/false.BLOB — бинарные данные (изображения, файлы).JSON — полуструктурированные документы JSON.Практический чек-лист:
DECIMAL, а не FLOAT.VARCHAR, а CHAR — только для фиксированной длины.Точный выбор типов на этапе проектирования уменьшает количество миграций, ошибок приложения и проблем с производительностью в будущем.
Ключевые выводы этого урока:
CHAR, VARCHAR и TEXT выбираются в зависимости от ожидаемой длины текста и особенностей хранения.DATE, TIME и TIMESTAMP, а не обычный текст.DECIMAL хранит точные значения и подходит для денег. FLOAT хранит приблизительные значения и может давать погрешность округления, поэтому больше подходит для научных расчётов.
В большинстве случаев используйте VARCHAR, потому что длина имени и email переменная. CHAR лучше подходит для полей фиксированной длины, например кодов страны.
Нет. NULL означает отсутствие или неизвестность значения. Это специальный маркер, а не отдельный тип данных.
Нужно оценить ожидаемый диапазон значений и выбрать наименьший тип, который его безопасно покрывает. Это экономит место и помогает избежать переполнения.
Потому что DECIMAL хранит точные значения и не даёт ошибок округления, характерных для типов с плавающей точкой.
Частые последствия: ошибки преобразования, некорректная сортировка и фильтрация, лишний расход памяти, более медленные запросы и усложнение логики приложения.