Числовые типы и AUTO_INCREMENT
Выбираем правильный числовой тип: целые, дробные, деньги — и разбираем автоинкремент.
Тип данных столбца определяет, какие значения в нём допустимы, сколько места он занимает и как с ним обращается база.
Целые числа
MySQL предлагает несколько целочисленных типов разного размера. Выбирайте минимальный, которого хватает: это экономит память и ускоряет работу.
| Тип | Размер | Диапазон (со знаком) |
TINYINT | 1 байт | −128 … 127 |
SMALLINT | 2 байта | ±32 тыс. |
INT | 4 байта | ±2.1 млрд |
BIGINT | 8 байт | очень большой |
Модификатор 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
Итог
- Для целых берите минимально достаточный тип:
TINYINT…BIGINT;UNSIGNED— если число неотрицательное. AUTO_INCREMENTв MySQL автоматически нумерует строки (обычно на первичном ключе).- Для денег только
DECIMAL—FLOAT/DOUBLEхранят неточно. - «Булево» в MySQL обычно изображают через
TINYINT(1)со значениями 0/1.