← Назад к вопросам
Какие знаешь типы полей таблицы в SQL?
1.0 Junior🔥 181 комментариев
#Базы данных и SQL
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Какие знаешь типы полей таблицы в SQL?
Ответ: SQL имеет множество типов данных, которые разделяются по категориям. Я знаю основные типы и когда их использовать. Это критично для правильного дизайна БД и производительности.
Основные категории типов SQL
SQL типы данных разделяются на несколько категорий:
1. Числовые типы (Numeric Types)
Целые числа (Integers)
-- Разные диапазоны, разная память
TINYINT -- -128 до 127 (1 байт)
SMALLINT -- -32768 до 32767 (2 байта)
INT -- -2147483648 до 2147483647 (4 байта)
BIGINT -- -9223372036854775808 до ... (8 байт)
-- Примеры
CREATE TABLE users (
id BIGINT PRIMARY KEY, -- для больших ID (до 9*10^18)
age TINYINT CHECK (age >= 0), -- возраст 0-255
post_count INT DEFAULT 0, -- количество постов
revenue BIGINT -- большие числа
);
Числа с плавающей запятой
FLOAT -- 4 байта, приблизительное значение
DOUBLE -- 8 байт, приблизительное значение
DECIMAL(p,s) -- Точный, где p - всего цифр, s - после запятой
-- Примеры
CREATE TABLE products (
id INT PRIMARY KEY,
price DECIMAL(10, 2), -- 10 цифр, 2 после запятой (9999999.99)
rating FLOAT, -- оценка 0.0-5.0 (неточное, но быстро)
cost DECIMAL(12, 4) -- стоимость с 4 знаками после запятой
);
Ключевое различие:
-- ❌ Плохо для денег: неточное
price FLOAT = 99.99;
price + 0.01 = 100.00000001; -- Ошибка!
-- ✅ Правильно для денег: точное
price DECIMAL(10, 2);
price + 0.01 = 100.00; -- Правильно
2. Текстовые типы (String/Text Types)
Фиксированная длина
CHAR(n) -- Ровно n символов (малыми буквами пробелы)
VARCHAR(n) -- До n символов (переменная длина)
-- Примеры
CREATE TABLE accounts (
id INT,
country_code CHAR(2), -- всегда 2 символа: 'US', 'RU', 'UK'
email VARCHAR(255), -- до 255 символов
phone VARCHAR(20) -- телефон с кодом
);
Длинный текст
TEXT -- Неограниченный текст (или очень большой)
LONGTEXT -- Еще больше текста
CLOB -- Character Large Object (для очень больших текстов)
-- Примеры
CREATE TABLE posts (
id INT PRIMARY KEY,
title VARCHAR(255), -- названи (до 255 символов)
content TEXT, -- содержание (любой размер)
description VARCHAR(500), -- описание (до 500)
metadata LONGTEXT -- JSON, очень длинный текст
);
3. Дата и время (Date/Time Types)
DATE -- Только дата (YYYY-MM-DD)
TIME -- Только время (HH:MM:SS)
DATETIME -- Дата и время (без таймзоны)
TIMESTAMP -- Дата, время и таймзона
TIMESTAMPTZ -- PostgreSQL: с таймзоной (обычно UTC)
INTERVAL -- Промежуток времени
-- Примеры
CREATE TABLE orders (
id INT PRIMARY KEY,
order_date DATE, -- только дата
created_at TIMESTAMP, -- когда создан заказ
delivered_at TIMESTAMPTZ, -- когда доставлен (с таймзоной)
processing_time INTERVAL -- как долго обрабатывался
);
-- ВАЖНО: в современных системах всегда TIMESTAMPTZ с UTC!
CREATE TABLE events (
id INT,
happened_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP AT TIME ZONE 'UTC'
);
4. Логические типы
BOOLEAN -- TRUE / FALSE / NULL (в SQL три состояния)
-- Примеры
CREATE TABLE users (
id INT,
is_active BOOLEAN DEFAULT TRUE,
is_premium BOOLEAN,
email_verified BOOLEAN DEFAULT FALSE
);
-- В запросах
SELECT * FROM users WHERE is_active = TRUE;
SELECT * FROM users WHERE is_premium IS NULL; -- без подписки
5. Двоичные типы (Binary)
BLOB -- Binary Large Object
BYTEA -- Байтовый массив (PostgreSQL)
BINARY(n) -- Ровно n байт
VARBINARY(n) -- До n байт
-- Примеры
CREATE TABLE files (
id INT,
data BLOB, -- хранит файл как байты
thumbnail BYTEA, -- картинка в PostgreSQL
hash BINARY(32) -- SHA256 хеш (ровно 32 байта)
);
6. JSON типы (современные)
JSON -- JSON документ
JSONB -- JSON в бинарном формате (PostgreSQL, быстрее)
-- Примеры
CREATE TABLE products (
id INT,
attributes JSON, -- {"color": "red", "size": "L"}
config JSONB, -- более быстрый вариант
metadata JSON
);
-- Запросы к JSON
SELECT * FROM products WHERE attributes->>'color' = 'red';
SELECT * FROM products WHERE config @> '{"active": true}';
7. UUID/GUID
UUID -- Уникальный идентификатор
CHAR(36) -- Альтернатива (медленнее)
-- Примеры
CREATE TABLE users (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
email VARCHAR(255) UNIQUE,
created_at TIMESTAMPTZ DEFAULT NOW()
);
8. Enum (перечисления)
-- PostgreSQL
CREATE TYPE user_role AS ENUM ('admin', 'moderator', 'user');
CREATE TABLE users (
id INT,
role user_role DEFAULT 'user'
);
-- MySQL (без создания типа)
CREATE TABLE users (
role ENUM('admin', 'moderator', 'user')
);
9. Массивы (PostgreSQL)
-- Только в PostgreSQL
CREATE TABLE user_interests (
id INT,
tags TEXT[], -- массив строк
scores INT[] -- массив чисел
);
-- Вставка
INSERT INTO user_interests VALUES (1, ARRAY['python', 'sql', 'nodejs']);
-- Запрос
SELECT * FROM user_interests WHERE 'python' = ANY(tags);
Практические примеры
Пример 1: Хорошо спроектированная таблица пользователя
CREATE TABLE users (
-- Идентификатор
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
-- Текстовые поля
email VARCHAR(255) NOT NULL UNIQUE,
password_hash VARCHAR(255) NOT NULL,
first_name VARCHAR(100),
last_name VARCHAR(100),
bio TEXT,
-- Числовые
age TINYINT CHECK (age >= 0 AND age <= 150),
balance DECIMAL(15, 2) DEFAULT 0.00,
-- Логические
is_active BOOLEAN DEFAULT TRUE,
is_verified BOOLEAN DEFAULT FALSE,
is_premium BOOLEAN DEFAULT FALSE,
-- Дата/Время
created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
last_login_at TIMESTAMPTZ,
-- Enum (роль)
role VARCHAR(50) DEFAULT 'user',
-- JSON
preferences JSONB DEFAULT '{}'::jsonb,
-- Индексы для быстрого поиска
INDEX idx_email (email),
INDEX idx_is_active (is_active),
INDEX idx_created_at (created_at)
);
Пример 2: Таблица заказов
CREATE TABLE orders (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
user_id UUID NOT NULL REFERENCES users(id),
-- Деньги - ВСЕГДА DECIMAL!
total_amount DECIMAL(12, 2) NOT NULL,
tax DECIMAL(10, 2),
-- Статус
status ENUM('pending', 'processing', 'completed', 'cancelled'),
-- Дата
created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
completed_at TIMESTAMPTZ,
-- Детали в JSON
items JSONB, -- [{"product_id": 123, "qty": 2, "price": 50.00}]
shipping_address JSONB,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
Выбор типа: best practices
| Данные | Тип | Почему |
|---|---|---|
| ID | UUID или BIGINT | UUID = масштабируемо, BIGINT = быстрее |
| VARCHAR(255) | Email может быть до 254 символов | |
| Пароль | VARCHAR(255) | Хешированный пароль ~60 символов |
| Деньги | DECIMAL(12,2) | Точность! Не FLOAT |
| Возраст | TINYINT | 0-150 значений |
| Активность | BOOLEAN | TRUE/FALSE |
| Дата создания | TIMESTAMPTZ | С таймзоной, всегда UTC |
| Контент | TEXT | Неограниченный размер |
| JSON данные | JSONB (PostgreSQL) | Быстрее чем JSON |
| Файл | BYTEA/BLOB | Хранить в S3, в БД только метаданные |
Частые ошибки
❌ FLOAT для денег
CREATE TABLE products (
price FLOAT -- Неточно! 99.99 + 0.01 = 100.00000001
);
✅ DECIMAL для денег
CREATE TABLE products (
price DECIMAL(10, 2) -- Точно! 99.99 + 0.01 = 100.00
);
❌ VARCHAR без длины
CREATE TABLE users (
email VARCHAR -- Неопределено, может быть проблемы
);
✅ VARCHAR с длиной
CREATE TABLE users (
email VARCHAR(255) -- Четко определено
);
❌ DATETIME для международных систем
created_at DATETIME -- Без таймзоны, потом будут проблемы
✅ TIMESTAMPTZ для международных систем
created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP AT TIME ZONE 'UTC'
Итог
- Числа: INT/BIGINT для целых, DECIMAL для денег, FLOAT только если погрешность OK
- Текст: VARCHAR(n) для коротких, TEXT для длинных
- Дата: TIMESTAMPTZ с UTC для современных систем
- JSON: JSONB в PostgreSQL для полуструктурированных данных
- Boolean: для TRUE/FALSE флагов
- UUID: для распределенных систем
- Enum: для ограниченного набора значений
Выбор правильного типа экономит память, ускоряет запросы и предотвращает баги (особенно с деньгами и датами).