Сьогодні поговоримо про числові типи даних у PostgreSQL. Якщо ти колись думав, як зберігати число "42", фінансові розрахунки або, може, мілісекунди — ти за адресою. Давай розбиратись, який тип підходить для кожної задачі, щоб ти і твої дані почували себе комфортно.
Числові типи даних у PostgreSQL діляться на три основні групи:
- Цілі числа (
INTEGER): для зберігання чисел без дробової частини. Це звичні числа типу 1, 42, -7. - Точні числа (
NUMERIC): для зберігання чисел з фіксованою кількістю знаків після коми. Корисно для фінансових розрахунків, де точність важливіша за життя. - Числа з плаваючою комою (
REAL): для зберігання чисел, які можуть бути дуже великими або мега малими. Вони менш точні, ніжNUMERIC, але підходять для наукових обчислень.
Тип INTEGER
INTEGER — це тип даних для цілих чисел. Підходить для випадків, коли треба зберігати числа без дробової частини. PostgreSQL дає аж три різновиди INTEGER, щоб покрити різні діапазони:
SMALLINT: маленький цілочисельний тип. Діапазон: від -32,768 до 32,767.INTEGER(абоINT): стандартний цілочисельний тип. Діапазон: від -2,147,483,648 до 2,147,483,647.BIGINT: для великих чисел. Діапазон: від -9,223,372,036,854,775,808 до 9,223,372,036,854,775,807.
Уявімо, що у нас є таблиця students, де зберігається інфа про студентів: їх ім'я, вік і кількість набраних кредитів (академічних балів):
| id | name | age | credits |
|---|---|---|---|
| 1 | Otto Nate | 21 | 30 |
| 2 | Maria Chi | 22 | 45 |
| 3 | Peter Val | 20 | 60 |
| 4 | Anna Song | 23 | 50 |
| 5 | Sophie Zhang | 21 | 35 |
Тепер зробимо простий SQL-запит, щоб отримати список студентів з їх віком і кількістю кредитів:
SELECT name, age, credits
FROM students;
Результат:
| name | age | credits |
|---|---|---|
| Otto Nate | 21 | 30 |
| Maria Chi | 22 | 45 |
| Peter Val | 20 | 60 |
| Anna Song | 23 | 50 |
| Sophie Zhang | 21 | 35 |
Коли юзати INTEGER?
- Зберігання ідентифікаторів (
id, номер замовлення). - Зберігання кількості чогось (наприклад, кількість товарів на складі, кількість студентів).
Тип NUMERIC
NUMERIC — це тип даних для точних чисел з фіксованою комою. Якщо треба зберігати щось типу 123.456, і помилка в одному знаку після коми коштуватиме тобі репутації (або грошей), юзай NUMERIC.
Формат оголошення: NUMERIC(precision, scale), де:
precision— загальна кількість цифр (і до, і після коми).scale— кількість цифр після коми.
Наприклад, NUMERIC(6, 2) дозволяє зберігати числа з максимум 6 цифрами і 2 з них після коми.
Створимо таблицю для обліку фінансових транзакцій:
| id | description | amount |
|---|---|---|
| 1 | Оплата за навчання | 2345.67 |
| 2 | Щомісячна стипендія | 500.00 |
| 3 | Збір за лабораторію | 145.99 |
| 4 | Штраф за бібліотеку | 12.75 |
| 5 | Реєстрація на конференцію | 320.50 |
Тепер виведемо список транзакцій:
SELECT description, amount
FROM transactions;
Результат:
| description | amount |
|---|---|
| Оплата за навчання | 2345.67 |
| Щомісячна стипендія | 500.00 |
| Збір за лабораторію | 145.99 |
| Штраф за бібліотеку | 12.75 |
| Реєстрація на конференцію | 320.50 |
Коли юзати NUMERIC?
- Фінансові розрахунки (вартість товарів, зарплати).
- Зберігання точних вимірювань (вага, довжина).
Таблиця measurements
| id | mass - REAL | height - REAL |
|---|---|---|
| 1 | 70.5 | 1.83 |
| 2 | 64.2 | 1.75 |
| 3 | 82.3 | 1.92 |
| 4 | 55.0 | 1.60 |
Тепер виведемо значення:
SELECT mass, height
FROM measurements;
Результат:
| mass | height |
|---|---|
| 70.5 | 1.83 |
| 64.2 | 1.75 |
| 82.3 | 1.92 |
| 55.0 | 1.60 |
Коли юзати REAL?
- Наукові обчислення (маса атомів, відстань до Місяця).
- Моделювання даних, де похибки ок.
Порівняння числових типів: що коли юзати?
| Тип даних | Діапазон | Точність | Приклади застосування |
|---|---|---|---|
SMALLINT |
-32,768 до 32,767 | Цілі числа | Невеликі числа (вік, рейтинги). |
INTEGER |
-2,147,483,648 до 2,147,483,647 | Цілі числа | Ідентифікатори, кількості. |
BIGINT |
-9,223,372,036,854,775,808 до 9,223,372,036,854,775,807 | Цілі числа | Дуже великі числа. |
NUMERIC |
Залежить від precision і scale |
Точні десяткові числа | Фінанси, вимірювання. |
REAL |
Приблизно 6 десяткових знаків | Плаваюча кома | Приблизні або наукові дані. |
DOUBLE PRECISION |
Приблизно 15 десяткових знаків | Високоточна плаваюча кома | Наука, дослідження. |
Псевдоніми
У PostgreSQL у багатьох числових типів є аліаси (синоніми) — це альтернативні назви типів, які поводяться однаково, але покращують читабельність або сумісність з іншими СУБД.
Ось короткий і зрозумілий гайд по аліасам числових типів у PostgreSQL:
Аліаси для цілочисельних типів
| Аліас | Реальний тип | Розмір | Діапазон |
|---|---|---|---|
INT |
INTEGER |
4 байти | −2,147,483,648 до 2,147,483,647 |
INT4 |
INTEGER |
4 байти | (застарілий аліас) |
SMALLINT |
SMALLINT |
2 байти | −32,768 до 32,767 |
INT2 |
SMALLINT |
2 байти | |
BIGINT |
BIGINT |
8 байт | −9 квінтильйонів до +9 квінтильйонів |
INT8 |
BIGINT |
8 байт |
Аліаси для точних чисел
| Аліас | Реальний тип | Призначення |
|---|---|---|
DEC |
NUMERIC |
Синонім по SQL-стандарту |
DECIMAL |
NUMERIC |
Те ж саме |
Аліаси для чисел з плаваючою комою
| Аліас | Реальний тип | Точність |
|---|---|---|
FLOAT |
DOUBLE PRECISION |
~15 знаків (за замовчуванням) |
FLOAT(24) |
REAL |
~6 знаків |
FLOAT(53) |
DOUBLE PRECISION |
~15 знаків |
FLOAT8 |
DOUBLE PRECISION |
Застарілий аліас |
FLOAT4 |
REAL |
Застарілий аліас |
Типові помилки
Працюючи з числовими типами, можна натрапити на кілька підводних каменів:
Вибір недостатнього типу даних. Якщо для віку людей ти юзаєш SMALLINT, помиляєшся. Роботу з "Матриці", у якого вік мільйони років, прикро.
Втрата даних при округленні. Якщо юзати REAL у фінансових розрахунках, можна втратити копійки. А потім і довіру клієнтів.
Порівняння різних типів. Якщо порівнювати INTEGER і REAL, можна отримати неочікувані результати через особливості представлення чисел з плаваючою комою.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ