| Тип | Байтів | Діапазон зі знаком | UNSIGNED |
|---|---|---|---|
TINYINT |
1 | -128..127 | 0..255 |
SMALLINT |
2 | -32 768..32 767 | 0..65 535 |
MEDIUMINT |
3 | ±8,4 млн | 0..16,7 млн |
INT |
4 | ±2,1 млрд | 0..4,29 млрд |
BIGINT |
8 | ±9,2 × 10^18 | 0..1,8 × 10^19 |
UNSIGNED - лише невід'ємні значення, зате вдвічі більший верхній діапазон.
Як обирати:
- Первинні ключі -
BIGINT UNSIGNED.INTзакінчується на 2,1 мільярда (4,29 зUNSIGNED), і в таблицях подій, логів чи лічильників це трапляється раніше, ніж очікують. Змінити тип ключа на великій таблиці - довга й ризикована операція. Laravel$table->id()створює самеBIGINT UNSIGNED. - Зовнішні ключі - того самого типу, що й ключ, на який вони посилаються, включно з
UNSIGNED. Інакше обмеження не створиться. - Прапорці й маленькі перелічення -
TINYINT.BOOLEANу MySQL - це синонімTINYINT(1).
Пастки:
INT(11)- не обмеження розміру. Число в дужках - лише «ширина відображення» для старогоZEROFILL, на діапазон не впливає й застаріло з MySQL 8.0.17.- Віднімання з
UNSIGNED:SELECT a - bдляUNSIGNED-колонок при від'ємному результаті дає помилку «out of range» (а в нестрогому режимі - величезне число). Для арифметики, де можливі від'ємні значення, -CAST(a AS SIGNED) - b. - Гроші не в
INTгривнях, а в копійках (BIGINT) чиDECIMAL. - Переповнення: у строгому режимі (
STRICT_TRANS_TABLES, за замовчуванням) вставка значення поза діапазоном - помилка; без нього значення тихо обрізається до межі.