Числовые типы и AUTO_INCREMENT

Выбираем правильный числовой тип: целые, дробные, деньги — и разбираем автоинкремент.

Тип данных столбца определяет, какие значения в нём допустимы, сколько места он занимает и как с ним обращается база.

Целые числа

MySQL предлагает несколько целочисленных типов разного размера. Выбирайте минимальный, которого хватает: это экономит память и ускоряет работу.

ТипРазмерДиапазон (со знаком)
TINYINT1 байт−128 … 127
SMALLINT2 байта±32 тыс.
INT4 байта±2.1 млрд
BIGINT8 байточень большой

Модификатор UNSIGNED убирает отрицательные значения и удваивает верхнюю границу — удобно для счётчиков и id, которые не бывают отрицательными.

CREATE TABLE products (
  id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  stock SMALLINT UNSIGNED,
  is_active TINYINT(1)        -- так в MySQL принято хранить «булево»: 0/1
);

AUTO_INCREMENT

Это MySQL-способ автоматически нумеровать строки. Столбец с AUTO_INCREMENT сам получает следующее число при вставке, если вы его не указали. Обычно его ставят на первичный ключ.

INSERT INTO products (stock) VALUES (10);  -- id присвоится сам: 1, 2, 3...

В переносимом SQL (и в нашей песочнице на SQLite) тот же эффект даёт INTEGER PRIMARY KEY — значение подставляется автоматически. Сравните рабочий пример:

CREATE TABLE products (
  id INTEGER PRIMARY KEY,
  name TEXT,
  stock INTEGER
);

INSERT INTO products (name, stock) VALUES ('Кофе', 10);
INSERT INTO products (name, stock) VALUES ('Чай', 25);

SELECT id, name, stock FROM products;

Вывод:

id  name  stock
1   Кофе  10
2   Чай   25

Видите: id мы не задавали, а он сам стал 1 и 2 — это и есть автонумерация. В MySQL за неё отвечает ключевое слово AUTO_INCREMENT.

Дробные числа и деньги

Здесь важная ловушка. FLOAT и DOUBLE хранят числа приблизительно (плавающая точка) — для денег это недопустимо, копейки «поплывут». Для денег используйте DECIMAL(точность, знаков_после_запятой) — он хранит число точно.

price DECIMAL(10, 2)   -- до 99999999.99, ровно 2 знака после точки

Проверим арифметику на переносимом примере:

CREATE TABLE orders (
  id INTEGER PRIMARY KEY,
  price REAL,
  qty INTEGER
);

INSERT INTO orders (price, qty) VALUES (199.90, 3);
INSERT INTO orders (price, qty) VALUES (49.50, 2);

SELECT id, price * qty AS total FROM orders;

Вывод:

id  total
1   599.7
2   99.0

Итог

  • Для целых берите минимально достаточный тип: TINYINTBIGINT; UNSIGNED — если число неотрицательное.
  • AUTO_INCREMENT в MySQL автоматически нумерует строки (обычно на первичном ключе).
  • Для денег только DECIMALFLOAT/DOUBLE хранят неточно.
  • «Булево» в MySQL обычно изображают через TINYINT(1) со значениями 0/1.
Проверьте себя
1. Какой тип выбрать для хранения денежной суммы?
AFLOAT
BDOUBLE
CDECIMAL
DINT
2. Что делает модификатор UNSIGNED у целочисленного типа?
Aразрешает только дробные значения
Bзапрещает отрицательные значения и расширяет верхнюю границу
Cделает столбец первичным ключом
Dускоряет вставку
3. Зачем нужен AUTO_INCREMENT?
Aчтобы шифровать значения
Bчтобы база сама присваивала следующий номер новой строке
Cчтобы хранить дробные числа
Dчтобы ограничить длину строки
Поддержать проект