- 17 октября 2026
- 11 минут
- 5
Статью подготовили специалисты образовательного сервиса Zaochnik.
Типы данных в SQL
SQL типы данных обеспечивают структуру и формат информации, хранимой в базах данных. Каждый тип данных задает правила хранения, размер, допустимые значения и влияет на производительность и целостность данных.
Тип данных SQL - это спецификация формата, в котором сохраняются и обрабатываются данные в СУБД.
Строковые типы данных в SQL
В SQL присутствуют несколько основных строковых типов. CHAR(N) хранит фиксированную длину строки N, от 0 до 65 535 символов. Объем памяти равен числу символов N. Например, CHAR(7) занимает ровно 7 байт. Ввод длиной свыше N приводит к усечению значения. Строки короче заполняются пробелами до размера N.
Тип VARCHAR(N) предназначен для переменной длины строк длиной до N символов. Фактический объем использования памяти равен K+1 байт, где K — длина строки. Например, VARCHAR(4) строка 'toy' занимает 4 байта, пустая строка — 1 байт. Так как размер изменяется, VARCHAR экономит место по сравнению с CHAR при хранении строк разной длины.
TEXT позволяет хранить большие объемы текстовой информации. Максимальная длина — 2^16-1 (65 535) символов, объем памяти занимает K+2 байта, где K — длина текста. Этот тип оптимизирован для хранения больших описаний или логов, но операции с ним медленнее.
Тип BLOB аналогичен TEXT, но предназначен для бинарных данных. Максимальный объем равен также 2^16-1 байт, с затратами памяти K+2 байта. Применяется для хранения изображений, аудио и других двоичных форматов внутри базы.
MEDIUMTEXT/ MEDIUMBLOB увеличивают предел размера до 2^24-1 (16 777 215) символов или байт соответственно. Занимаемый объем — K+3 байта. Используются для массивных объемов данных, что обеспечивает гибкость для мультимедийных or архивных данных.
LONGTEXT/LONGBLOB расширяют максимальный объем до 2^32-1 (около 4 Гб). Объем памяти равен K+4 байта. Это максимальный доступный размер для хранения больших текстов и двоичных данных в MySQL. Считается, что обработка таких типов данных требует дополнительной оптимизации запроса и памяти.
ENUM хранит одно строковое значение из фиксированного набора до 65 535 элементов. Память занимает 1 байт при количестве элементов до 255 и 2 байта при большем количестве. Ограничение массива значений обеспечивает быстрый доступ и экономию памяти. Например, ENUM('лето', 'зима') хранит только одно из двух значений.
SET представляет собой множество из до 64 допустимых строковых элементов, которые могут храниться одновременно. Задействует до 8 байт памяти. Он позволяет сохранять комбинации элементов, например SET('лето', 'зима') может содержать 'лето', 'зима', либо оба, либо пустое значение.
VARCHAR(4) со значениями '', 't', 'to', 'toy' занимает 1, 2, 3 и 4 байта памяти соответственно.
ENUM('лето', 'зима') хранит либо 'лето', либо 'зима', что использует 1 байт памяти.
SET('лето', 'зима') может содержать 'лето', 'зима', оба или пустое, используя до 1 байта.
Календарные типы данных SQL
Календарные типы данных предоставляют хранение дат и/или времени с фиксированными форматами и размерами. Они имеют чётко определённый диапазон и стандарты записи.
DATE сохраняет дату в формате YYYY-MM-DD. Разделитель может быть произвольным, кроме цифр. Объем памяти — 3 байта. Диапазон действителен с 1000-01-01 по 9999-12-31. Преобразование даты в внутреннее представление требует вычислений для определения дня, месяца и года с учётом високосных лет.
TIME предназначен для времени суток в формате hh:mm:ss с диапазоном от -838:59:59 до 838:59:59, что покрывает время более 34 дней. Объем памяти составляет 3 байта. Такой диапазон необычен и нужен для расчётов длительностей или временных интервалов, включая отрицательные значения. Разделителем служит любой символ, кроме цифр.
DATETIME
TIMESTAMP хранит количество секунд с 1970-01-01 00:00:00 по UNIX эпоху. Объем памяти — 4 байта. Диапазон ограничен 1970—2037 годами из-за ограничения в 32-битном знаковом числе. Значение используется для точной фиксации текущего времени создания или изменения записи, требует корректировок при смене часовых поясов или переходе на летнее время.
YEAR(N) хранит год с вариацией формата: при N=2 — диапазон 1970–2069, 1 байт памяти; при N=4 — диапазон 1901–2155, также 1 байт памяти. Формат с 2 цифрами часто вызывает двусмысленность, что стоит учитывать при проектировании баз данных.
DATE поле с значением «2023-03-15» занимает 3 байта и сопоставляется с годом, месяцем и днём.
TIMESTAMP 1577836800 соответствует 2020-01-01 00:00:00 UTC и занимает 4 байта.
Тип данных NULL и его особенности
NULL в SQL обозначает отсутствие значения в поле. Этот статус не относится к типам данных как таковым, а является отдельным состоянием.
В таблицах поля по умолчанию имеют ограничение NOT NULL, то есть не могут содержать пустое значение. Это гарантирует целостность данных и предотвращает ошибки обработки.
Для необязательных данных допускается использование состояния NULL, что означает отсутствие значения. Например, поля 'Дата рождения' или 'Пол' могут иметь значение NULL, если информация неизвестна или не указана.
Механизм обработки NULL требует особого внимания при написании SQL-запросов, так как сравнения с NULL нельзя делать обычными операторами равенства/неравенства. Используются специальные конструкции IS NULL и IS NOT NULL.
Отсутствие NULL в обязательных полях позволяет избежать неопределённости и поддерживает строгую валидацию данных на уровне СУБД.
В таблице пользователей поле 'Логин' помечено NOT NULL и обязательно для заполнения. Поле 'Дата рождения' может содержать NULL, если дата неизвестна.
Сравнительная таблица основных SQL типов данных
Ниже представлена таблица с ключевыми характеристиками строковых и календарных типов данных, содержащая объем памяти, типы значений и ограничения.
| Тип данных | Объем памяти | Диапазон/Максимальный размер | Особенности |
|---|---|---|---|
| CHAR(N) | N байт | 0–65 535 символов | Фиксированная длина, дополнение пробелами |
| VARCHAR(N) | K+1 байт | 0–65 535 символов | Переменная длина, экономия памяти |
| TEXT | K+2 байта | До 65 535 символов | Большие тексты, нестандартные операции |
| BLOB | K+2 байта | До 65 535 байт | Двоичные данные |
| MEDIUMTEXT/MEDIUMBLOB | K+3 байта | До 16 777 215 символов/байт | Большие объемы, требует оптимизации |
| LONGTEXT/LONGBLOB | K+4 байта | До около 4 Гб | Максимальный размер |
| ENUM | 1–2 байта | До 65 535 элементов | Ограниченный набор значений |
| SET | До 8 байт | До 64 элементов | Сочетание значений множества |
| DATE | 3 байта | 1000-01-01 – 9999-12-31 | Хранит дату, формат YYYY-MM-DD |
| TIME | 3 байта | -838:59:59 – 838:59:59 | Время или длительность |
| DATETIME | 8 байт | 1000-01-01 00:00:00 – 9999-12-31 23:59:59 | Дата и время вместе |
| TIMESTAMP | 4 байта | 1970-01-01 00:00:00 – 2037-12-31 23:59:59 | Время Unix эпохи |
| YEAR(N) | 1 байт | 1970–2069 (N=2), 1901–2155 (N=4) | Хранит год, разрядность задаёт диапазон |
Типичные ошибки и ограничения при работе с SQL типами данных
Частая ошибка — неправильный выбор типа данных. Например, использование CHAR для переменных по длине строк увеличивает объем памяти без необходимости. VARCHAR экономит место, но может немного замедлить доступ из-за необходимости хранения длины.
Усечение строк при вводе данных приводит к потере информации. CHAR(7) обрежет более длинные строки без предупреждения, что вызывает ошибки в данных. При необходимости контроля стоит реализовывать ограничения в приложении.
Для календарных типов следует учитывать ограничения диапазонов. TIMESTAMP имеет ограничение по времени до 2037 года, что подходит для систем с ограниченным горизонтом, но непригоден для долгосрочных архивов, где применяется DATETIME.
Различия в формате DATE и DATETIME влияют на совместимость и функции поиска. Например, операции с датой требуют аккуратности в конвертации типов и форматах.
Использование NULL требует внимательности. Пренебрежение проверками IS NULL или несоблюдение привычек при объединении данных ведёт к неожиданным результатам и ошибкам. Часто SQL-запросы с NULL ведут себя непредсказуемо.
Матрица выбора SQL типов данных в зависимости от задачи и ограничений
Рассмотрим выбор типа данных SQL в зависимости от потребностей и ограничений.
- Если необходимо хранить строки фиксированной длины и важна постоянная скорость доступа — выбрать CHAR(N), но учитывать дополнительное потребление памяти с ростом N.
- Для хранения строк переменной длины с экономией памяти использовать VARCHAR(N), ограничив длину N максимальным размером.
- Для больших текстов свыше 65 535 символов выбирать TEXT, MEDIUMTEXT или LONGTEXT в зависимости от максимального ожидаемого объема.
- Для хранения строго ограниченного набора значений применить ENUM или SET — они снижают риски ошибок ввода и экономят память.
- При работе с датами в пределах 1000–9999 годов выбрать DATE для даты, DATETIME для даты и времени, а при необходимости учета временной зоны — TIMESTAMP, учитывая ограничение по году 2037.
- Если стоит задача сохранения длительностей или отрицательного времени — выбрать TIME.
- Для полей опциональной заполненности применять ограничение NULL и NOT NULL строго по требованиям целостности.
Неправильный выбор типа данных может привести к избыточному расходу памяти, потерям данных или снижению производительности. Требуется анализ требований к данным и расчет предельных объемов перед проектированием таблиц.
Использование NULL совместимо не со всеми функциями и операторами SQL, что требует особой осторожности при формировании запросов.
При работе с ENUM и SET важно учитывать ограничение на количество элементов, превышение которого приводит к ошибкам при создании или изменении таблиц.