Основы типизации: от чисел до сложных структур

Иван Корнев·07.05.2026·5 мин

Тип данных — это классификация информации, которая определяет, какие значения может хранить переменная и какие операции над ней разрешены. Простыми словами: тип говорит компьютеру, является ли «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) выполняйте только на стороне клиента (в браузере или приложении). Иначе при переходе на летнее/зимнее время или смене сервера данные «поедут».

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

Выбор конкретного названия типа зависит от языка программирования или СУБД.

КатегорияPythonJavaScriptSQL (PostgreSQL/MySQL)C# / Java
Целое числоintNumber (или BigInt)INT, BIGINTint, long
Дробное числоfloatNumberFLOAT, DOUBLEfloat, double
Точное числоDecimal(библиотеки)DECIMAL, NUMERICBigDecimal
ТекстstrStringVARCHAR, TEXTString
ЛогическийboolBooleanBOOLEANboolean
Дата/ВремяdatetimeDateTIMESTAMP, DATEDateTime
ОтсутствиеNonenull / undefinedNULLnull

Как выбрать правильный тип?

  1. Экономия памяти: Если поле принимает значения от 1 до 100, нет смысла использовать BIGINT (8 байт), достаточно TINYINT (1 байт). В высоконагруженных системах это экономит гигабайты диска и оперативной памяти.
  2. Скорость поиска: Числовые индексы в базах данных работают быстрее строковых. Если у вас есть ID товара, храните его как число, а не как строку "123".
  3. Целостность данных: Используйте строгие типы. Если поле должно содержать email, лучше валидировать его на уровне приложения, но хранить как строку. Если статус ограничен 3 вариантами — используйте Enum.

Частые ошибки новичков

  1. Сложение строк вместо чисел. В JavaScript "5" + 5 даст "55" (конкатенация), а не 10. Нужно явно приводить типы: Number("5") + 5.
  2. Игнорирование Null. Попытка вызвать метод у null (например, null.length) приведет к падению программы. Всегда проверяйте наличие значения перед использованием.
  3. Хранение дат как строк. Если сохранить дату как "07.05.2026", вы не сможете легко отсортировать записи по времени или найти записи за «последнюю неделю». Используйте нативные типы Date или Timestamp.

FAQ

В чем разница между статической и динамической типизацией? В статически типизированных языках (C++, Java, Go) тип переменной указывается при объявлении и не может меняться. В динамических (Python, JS) тип привязан к значению, и переменная может сегодня хранить число, а завтра — строку.

Что такое типизация в базах данных? В SQL вы обязаны указать тип каждого столбца таблицы при её создании. Это гарантирует, что в колонку «Возраст» не запишут имя, а в «Цену» — дату.

Почему нельзя хранить всё как строки? Строки занимают больше места, их сложнее индексировать, и над ними нельзя выполнять математические операции или сортировку по времени без предварительного преобразования, что нагружает процессор.