Основы типизации: от чисел до сложных структур
Тип данных — это классификация информации, которая определяет, какие значения может хранить переменная и какие операции над ней разрешены. Простыми словами: тип говорит компьютеру, является ли «42» числом, с которым можно складывать, или текстом «42», который можно только отображать. Правильный выбор типа экономит память, ускоряет выполнение кода и предотвращает логические ошибки.
В этой статье мы разберем примитивные и сложные типы данных, приведем примеры из популярных языков (Python, JavaScript, SQL) и объясним, почему нельзя хранить деньги в типах с плавающей точкой.
Краткий ответ: Основные типы данных делятся на примитивные (числа, строки, булевы значения) и сложные (массивы, объекты). Выбор зависит от задачи: для счетов используйте Decimal, для флагов — Boolean, а для списков — Array.
Примитивные типы данных
Примитивы — это «атомы» программирования. Они хранят одно единственное значение и не имеют внутренней структуры.
1. Числовые типы (Numbers)
Компьютеры различают целые и дробные числа, так как они хранятся в памяти по-разному.
- Целые числа (
Integer,int): Используются для подсчета штук, ID пользователей, индексов. Не имеют дробной части.- Примеры:
1,-50,2026.
- Примеры:
- Числа с плавающей точкой (
Float,double): Используются для научных расчетов, где допустима небольшая погрешность.- Примеры:
3.14,0.001,2.5e10.
- Примеры:
- Десятичные числа (
Decimal): Критически важны для финансов. Хранят точное значение без ошибок округления.
Никогда не используйте Float для денег!
Из-за особенностей двоичной арифметики 0.1 + 0.2 в формате float может дать 0.30000000000000004. Для валют всегда используйте тип Decimal или храните сумму в минимальных единицах (копейках/центах) как Integer.
2. Строки (Strings)
Последовательность символов, представляющая текст. В современных системах обычно кодируются в UTF-8, что поддерживает эмодзи и кириллицу.
- Назначение: Имена, адреса, описания, JSON-структуры.
- Особенности: Строки неизменяемы (в большинстве языков). Конкатенация (склеивание) больших строк может быть затратной по памяти.
- Примеры:
"Hello World","[email protected]","2026-05-07".
3. Логический тип (Boolean)
Самый простой тип, имеющий всего два значения: true (истина) и false (ложь).
- Назначение: Флаги состояний, результаты сравнений, условия в коде.
- Примеры:
is_active = true,has_paid = false.
Избегайте хранения статусов в виде строк ("active", "inactive"), если есть только два состояния. Булев тип занимает меньше места (часто 1 бит или байт) и быстрее обрабатывается процессором.
4. Специальные значения
- Null / None / Nil: Означает «значение отсутствует». Это не ноль и не пустая строка, а именно пустота.
- Undefined (в JS): Переменная объявлена, но значение ей еще не присвоено.
Сложные (составные) типы данных
Эти типы позволяют группировать несколько значений в одну структуру.
Массивы и Списки (Arrays / Lists)
Упорядоченная коллекция элементов, доступ к которым осуществляется по индексу. Обычно все элементы массива имеют один тип.
- Пример (Python):
fruits = ["apple", "banana", "cherry"] - Пример (SQL): Тип
ARRAYв PostgreSQL.
Объекты и Словари (Objects / Dicts / Maps)
Набор пар «ключ-значение». Позволяют обращаться к данным по имени поля, а не по номеру.
- Пример (JSON):
{
"id": 101,
"name": "Alex",
"role": "admin"
}
```
* В Python это `dict`, в JavaScript — `Object`, в Java — `HashMap`.
### Перечисления (Enum)
Тип, который ограничивает переменную строго заданным набором значений.
* *Пример:* Статус заказа может быть только `NEW`, `PROCESSING`, `SHIPPED`, `DELIVERED`.
* **Зачем нужно:** Защищает от опечаток и невалидных данных на уровне кода или базы данных.
## Даты и время (Date & Time)
Хотя технически дата часто хранится как число (timestamp — секунды с 1 января 1970 года), логически это отдельный тип.
* **Date:** Только дата (год-месяц-день).
* **Time:** Только время (часы-минуты-секунды).
* **DateTime / Timestamp:** Дата и время вместе.
Проблема часовых поясов Всегда храните время в базе данных в формате UTC. Конвертацию в локальное время пользователя (например, MSK или EST) выполняйте только на стороне клиента (в браузере или приложении). Иначе при переходе на летнее/зимнее время или смене сервера данные «поедут».
Сравнение типов в разных средах
Выбор конкретного названия типа зависит от языка программирования или СУБД.
| Категория | Python | JavaScript | SQL (PostgreSQL/MySQL) | C# / Java |
|---|---|---|---|---|
| Целое число | int | Number (или BigInt) | INT, BIGINT | int, long |
| Дробное число | float | Number | FLOAT, DOUBLE | float, double |
| Точное число | Decimal | (библиотеки) | DECIMAL, NUMERIC | BigDecimal |
| Текст | str | String | VARCHAR, TEXT | String |
| Логический | bool | Boolean | BOOLEAN | boolean |
| Дата/Время | datetime | Date | TIMESTAMP, DATE | DateTime |
| Отсутствие | None | null / undefined | NULL | null |
Как выбрать правильный тип?
- Экономия памяти: Если поле принимает значения от 1 до 100, нет смысла использовать
BIGINT(8 байт), достаточноTINYINT(1 байт). В высоконагруженных системах это экономит гигабайты диска и оперативной памяти. - Скорость поиска: Числовые индексы в базах данных работают быстрее строковых. Если у вас есть ID товара, храните его как число, а не как строку
"123". - Целостность данных: Используйте строгие типы. Если поле должно содержать email, лучше валидировать его на уровне приложения, но хранить как строку. Если статус ограничен 3 вариантами — используйте
Enum.
Частые ошибки новичков
- Сложение строк вместо чисел.
В JavaScript
"5" + 5даст"55"(конкатенация), а не10. Нужно явно приводить типы:Number("5") + 5. - Игнорирование Null.
Попытка вызвать метод у
null(например,null.length) приведет к падению программы. Всегда проверяйте наличие значения перед использованием. - Хранение дат как строк.
Если сохранить дату как
"07.05.2026", вы не сможете легко отсортировать записи по времени или найти записи за «последнюю неделю». Используйте нативные типыDateилиTimestamp.
FAQ
В чем разница между статической и динамической типизацией? В статически типизированных языках (C++, Java, Go) тип переменной указывается при объявлении и не может меняться. В динамических (Python, JS) тип привязан к значению, и переменная может сегодня хранить число, а завтра — строку.
Что такое типизация в базах данных? В SQL вы обязаны указать тип каждого столбца таблицы при её создании. Это гарантирует, что в колонку «Возраст» не запишут имя, а в «Цену» — дату.
Почему нельзя хранить всё как строки? Строки занимают больше места, их сложнее индексировать, и над ними нельзя выполнять математические операции или сортировку по времени без предварительного преобразования, что нагружает процессор.