Типы данных
У каждого столбца таблицы STRICT один из пяти типов:
INTEGER(илиINT) — целые числа: цены в целых долларах, количества, идентификаторы, годы.REAL— десятичные числа, например 4.25 или 1.5.TEXT— текст любой длины: имена, адреса электронной почты, комментарии.BLOB— «сырые» байты, например картинка или другой файл, которые хранятся как есть. Нужен редко.ANY— любое значение, как в таблице безSTRICT. Используйте его, только если в столбце действительно должны лежать значения разных видов.
В SQLite нет типа для дат. Дата хранится как TEXT в виде 'YYYY-MM-DD', как в столбцах магазина released и ordered_at. Почему так, вы знаете из прошлых уроков: даты в таком виде правильно сортируются и сравниваются, а функции вроде strftime() и date() их понимают. Дата со временем записывается как '2025-11-28 14:30:00'.
Нет и типа для «истины» и «лжи». Столбец «да или нет» — это INTEGER, где 1 означает «да», а 0 — «нет», а запрос спрашивает WHERE used = 1 или WHERE used = 0. Так магазин мог бы хранить свои подарочные карты:
CREATE TABLE gift_cards (
code TEXT,
amount INTEGER,
sold TEXT,
used INTEGER
) STRICT;
INSERT INTO gift_cards (code, amount, sold, used)
VALUES ('GIFT-7Q2X', 25, '2025-12-01', 1),
('GIFT-K9LM', 50, '2025-12-18', 0),
('GIFT-3RTP', 25, '2025-12-21', 0);
SELECT code, amount, sold
FROM gift_cards
WHERE used = 0;| code | amount | sold |
|---|---|---|
| GIFT-K9LM | 50 | 2025-12-18 |
| GIFT-3RTP | 25 | 2025-12-21 |
Почему amount — это INTEGER, а не REAL? Подарочные карты, как и цены в магазине, указаны в целых долларах. А когда магазину нужны центы, их часто тоже хранят целыми числами: $25.99 хранится как 2599 центов. Десятичные числа в компьютере неточны (0.1 + 0.2 чуть больше 0.3), а когда речь о деньгах, важен каждый цент. REAL подходит для величин, которые измеряют, а не считают: средняя оценка, часы в игре, вес. Столбец REAL превращает целое число в десятичное, поэтому 3 возвращается как 3.0.
В других базах данных типов больше, и вы встретите их в других курсах и на работе:
VARCHAR(n)— текст не длиннее n символов, напримерVARCHAR(100)для имени.DATE,TIME,TIMESTAMP— даты и время.BOOLEAN—TRUEилиFALSE.DECIMAL(p, s)— точные десятичные числа, напримерDECIMAL(10, 2)для сумм с центами.
Таблица STRICT в SQLite принимает только пять перечисленных выше типов (и INT); любой другой тип — ошибка:
CREATE TABLE gift_cards (
code VARCHAR(20),
amount INTEGER
) STRICT;Error on line 1: unknown datatype for gift_cards.code: "VARCHAR(20)"Поэтому в SQLite пишите TEXT для текста, дат и времени, INTEGER для целых чисел и значений «да или нет» и REAL для десятичных чисел.
Типичная ошибка: дата в другом виде, например '11/28/2025'. Это текст, поэтому база данных сохранит его без ошибки, но как дата он не сортируется ('11/28/2025' окажется раньше '12/01/2024'), а функции дат вернут для него NULL. Всегда записывайте даты как 'YYYY-MM-DD'.
Задание
- 1
Магазин проводит мероприятия для игроков. Создайте таблицу
eventsтипаSTRICTс такими четырьмя столбцами, в таком порядке, каждый с подходящим типом:name— название мероприятия,starts— день, когда оно проходит,hours— сколько оно длится, в часах (например, 1.5),online— проходит ли оно онлайн (да или нет).
- 2
Вставьте эти четыре мероприятия, а затем покажите все столбцы всех мероприятий, отсортированные по дате:
- Retro Night — в магазине 30 января 2026 года, 2.5 часа,
- Puzzle Marathon — онлайн 21 февраля 2026 года, 6 часов,
- Speedrun Cup — онлайн 14 марта 2026 года, 3 часа,
- Launch Party — в магазине 2 апреля 2026 года, 1.5 часа.
Результат:
name starts hours online Retro Night 2026-01-30 2.5 0 Puzzle Marathon 2026-02-21 6.0 1 Speedrun Cup 2026-03-14 3.0 1 Launch Party 2026-04-02 1.5 0 - 3
Добавьте запрос, который показывает название и дату онлайн-мероприятий, отсортированных по дате:
name starts Puzzle Marathon 2026-02-21 Speedrun Cup 2026-03-14