← Назад к вопросам

Какие знаешь типы полей таблицы в 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

ДанныеТипПочему
IDUUID или BIGINTUUID = масштабируемо, BIGINT = быстрее
EmailVARCHAR(255)Email может быть до 254 символов
ПарольVARCHAR(255)Хешированный пароль ~60 символов
ДеньгиDECIMAL(12,2)Точность! Не FLOAT
ВозрастTINYINT0-150 значений
АктивностьBOOLEANTRUE/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: для ограниченного набора значений

Выбор правильного типа экономит память, ускоряет запросы и предотвращает баги (особенно с деньгами и датами).