Типы данных SQL: INT, VARCHAR, DATE, DATETIME, BOOLEAN и др.
Зачем нужны типы данных? 🧐
Типы данных в SQL — это как "правила игры" для ваших столбцов. Они определяют:
- Какие значения можно хранить (числа, текст, даты)
- Сколько места займёт информация
- Какие операции возможны (например, сложение INT, но не VARCHAR)
Без типов данных СУБД не поймёт, как обрабатывать ваши записи. Это фундамент, на котором строится вся работа с базами!
Числовые типы: INT, FLOAT, DECIMAL 🔢
INT — целые числа
CREATE TABLE users (
id INT PRIMARY KEY,
age INT
);
- Диапазон: от -2,147,483,648 до 2,147,483,647
- Где использовать: ID, количество, любые целые значения
FLOAT и DECIMAL — числа с плавающей точкой
CREATE TABLE products (
price DECIMAL(10, 2), -- 10 цифр всего, 2 после запятой
rating FLOAT
);
- Разница:
DECIMALточный (для денег),FLOATприближённый (для научных расчётов)
Строковые типы: VARCHAR, TEXT 🅰️
VARCHAR(n) — текст переменной длины
CREATE TABLE books (
title VARCHAR(100), -- максимум 100 символов
author VARCHAR(50)
);
- Фишка: Занимает только нужное место + можно указать лимит
TEXT — для больших текстов
CREATE TABLE articles (
content TEXT -- без ограничения длины
);
- Производительность:
VARCHARбыстрее для коротких строк
Дата и время: DATE, TIME, DATETIME 📅
DATE — только дата
CREATE TABLE events (
event_date DATE -- формат: 'YYYY-MM-DD'
);
DATETIME — дата + время
CREATE TABLE orders (
created_at DATETIME -- 'YYYY-MM-DD HH:MM:SS'
);
Простой пример запроса:
SELECT * FROM orders
WHERE created_at > '2023-01-01 00:00:00';
Логический тип: BOOLEAN (BOOL) ✔️
Хранит TRUE или FALSE. В некоторых СУБД реализован как TINYINT(1):
CREATE TABLE tasks (
is_completed BOOLEAN DEFAULT FALSE
);
-- Вставка данных
INSERT INTO tasks (is_completed) VALUES (TRUE);
Экзотические, но полезные типы 🦄
ENUM — список допустимых значений
CREATE TABLE shirts (
color ENUM('red', 'blue', 'green')
);
JSON — хранение структурированных данных
CREATE TABLE users (
preferences JSON -- храним настройки пользователя
);
Как выбрать правильный тип? 🎯
- Минимизируйте место: Для возраста хватит
TINYINT(0-255), а неINT - Учитывайте операции: Для расчётов — числа, для поиска — строки
- Будущее: Поле
usernameлучше сделатьVARCHAR(50), чемVARCHAR(10)
Антипример (как НЕ надо):
CREATE TABLE bad_design (
phone_number INT, -- телефоны бывают с '+'
birth_date VARCHAR(10) -- нельзя проверить валидность
);
Практический кейс: интернет-магазин 🛒
Создадим оптимальную таблицу товаров:
CREATE TABLE products (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
price DECIMAL(10, 2) CHECK (price > 0),
category ENUM('electronics', 'clothing', 'food'),
in_stock BOOLEAN DEFAULT TRUE,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
Разбор полётов:
- AUTO_INCREMENT — автоматический ID
- CHECK — цена не может быть отрицательной
- DEFAULT — значения по умолчанию
Важные нюансы ⚠️
1. Приведение типов:
SELECT '10' + 5; -- Результат: 15 (строка преобразована в число)
2. Сравнение дат:
SELECT * FROM orders
WHERE order_date BETWEEN '2023-01-01' AND '2023-01-31';
3. Сортировка строк:
SELECT * FROM users ORDER BY name COLLATE utf8mb4_unicode_ci;
Итоги: золотые правила 💎
- Всегда явно указывайте типы — не полагайтесь на значения по умолчанию
- Выбирайте минимально достаточный тип (
SMALLINTvsBIGINT) - Для текста с известным максимумом —
VARCHAR, иначеTEXT - Даты храните только в специальных типах (
DATE/DATETIME)
Теперь вы готовы проектировать таблицы как профи! Когда тип данных выбран правильно — запросы летают, а данные остаются целыми. 🚀