Dzisiaj pogadamy o typach liczbowych w PostgreSQL. Jeśli kiedykolwiek zastanawiałeś się, jak przechować liczbę "42", rozliczenia finansowe albo może milisekundy — jesteś w dobrym miejscu. Zobaczmy, który typ pasuje do jakiego zadania, żebyś Ty i Twoje dane czuli się komfortowo.
Typy liczbowe w PostgreSQL dzielą się na trzy główne grupy:
- Liczby całkowite (
INTEGER): do przechowywania liczb bez części ułamkowej. To takie zwykłe liczby jak 1, 42, -7. - Liczby dokładne (
NUMERIC): do przechowywania liczb ze stałą liczbą miejsc po przecinku. Przydatne do rozliczeń finansowych, gdzie dokładność jest ważniejsza niż życie. - Liczby zmiennoprzecinkowe (
REAL): do przechowywania liczb, które mogą być bardzo duże albo niesamowicie małe. Są mniej dokładne niżNUMERIC, ale nadają się do obliczeń naukowych.
Typ INTEGER
INTEGER — to typ danych dla liczb całkowitych. Nadaje się, gdy trzeba przechować liczby bez części ułamkowej. PostgreSQL daje aż trzy warianty INTEGER, żeby ogarnąć różne zakresy:
SMALLINT: mały typ całkowity. Zakres: od -32,768 do 32,767.INTEGER(alboINT): standardowy typ całkowity. Zakres: od -2,147,483,648 do 2,147,483,647.BIGINT: dla dużych liczb. Zakres: od -9,223,372,036,854,775,808 do 9,223,372,036,854,775,807.
Wyobraź sobie, że mamy tabelę students, gdzie trzymamy info o studentach: ich imię, wiek i liczbę zdobytych punktów (kredytów akademickich):
| 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 |
Teraz wykonamy prosty zapytanie SQL, żeby dostać listę studentów z ich wiekiem i liczbą kredytów:
SELECT name, age, credits
FROM students;
Wynik:
| name | age | credits |
|---|---|---|
| Otto Nate | 21 | 30 |
| Maria Chi | 22 | 45 |
| Peter Val | 20 | 60 |
| Anna Song | 23 | 50 |
| Sophie Zhang | 21 | 35 |
Kiedy używać INTEGER?
- Przechowywanie identyfikatorów (
id, numer zamówienia). - Przechowywanie ilości czegoś (np. liczba produktów w magazynie, liczba studentów).
Typ NUMERIC
NUMERIC — to typ danych dla dokładnych liczb ze stałą przecinkiem. Jeśli musisz przechować coś jak 123.456 i błąd w jednym miejscu po przecinku kosztuje Cię reputację (albo kasę), użyj NUMERIC.
Format deklaracji: NUMERIC(precision, scale), gdzie:
precision— całkowita liczba cyfr (zarówno przed, jak i po przecinku).scale— liczba cyfr po przecinku.
Na przykład, NUMERIC(6, 2) pozwala przechować liczby z maksymalnie 6 cyframi, z czego 2 po przecinku.
Stwórzmy tabelę do rejestracji transakcji finansowych:
| id | description | amount |
|---|---|---|
| 1 | Oplata za naukę | 2345.67 |
| 2 | Miesięczne stypendium | 500.00 |
| 3 | Opłata za laboratorium | 145.99 |
| 4 | Kara za bibliotekę | 12.75 |
| 5 | Rejestracja na konferencję | 320.50 |
Teraz wyświetlimy listę transakcji:
SELECT description, amount
FROM transactions;
Wynik:
| description | amount |
|---|---|
| Oplata za naukę | 2345.67 |
| Miesięczne stypendium | 500.00 |
| Opłata za laboratorium | 145.99 |
| Kara za bibliotekę | 12.75 |
| Rejestracja na konferencję | 320.50 |
Kiedy używać NUMERIC?
- Rozliczenia finansowe (ceny produktów, pensje).
- Przechowywanie dokładnych pomiarów (waga, długość).
Tabela 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 |
Teraz wyświetlimy wartości:
SELECT mass, height
FROM measurements;
Wynik:
| mass | height |
|---|---|
| 70.5 | 1.83 |
| 64.2 | 1.75 |
| 82.3 | 1.92 |
| 55.0 | 1.60 |
Kiedy używać REAL?
- Obliczenia naukowe (masa atomów, odległość do Księżyca).
- Modelowanie danych, gdzie błędy są akceptowalne.
Porównanie typów liczbowych: co kiedy używać?
| Typ danych | Zakres | Dokładność | Przykłady użycia |
|---|---|---|---|
SMALLINT |
-32,768 do 32,767 | Liczby całkowite | Małe liczby (wiek, oceny). |
INTEGER |
-2,147,483,648 do 2,147,483,647 | Liczby całkowite | Identyfikatory, ilości. |
BIGINT |
-9,223,372,036,854,775,808 do 9,223,372,036,854,775,807 | Liczby całkowite | Bardzo duże liczby. |
NUMERIC |
Zależy od precision i scale |
Dokładne liczby dziesiętne | Finanse, pomiary. |
REAL |
Około 6 miejsc dziesiętnych | Zmiennoprzecinkowy | Przybliżone lub naukowe dane. |
DOUBLE PRECISION |
Około 15 miejsc dziesiętnych | Wysoka dokładność zmiennoprzecinkowa | Nauka, badania. |
Pseudonimy
W PostgreSQL wiele typów liczbowych ma aliasy (synonimy) — to alternatywne nazwy typów, które działają tak samo, ale poprawiają czytelność lub kompatybilność z innymi bazami danych.
Oto krótkie i jasne kompendium aliasów typów liczbowych w PostgreSQL:
Alias dla typów całkowitych
| Alias | Prawdziwy typ | Rozmiar | Zakres |
|---|---|---|---|
INT |
INTEGER |
4 bajty | −2,147,483,648 do 2,147,483,647 |
INT4 |
INTEGER |
4 bajty | (przestarzały alias) |
SMALLINT |
SMALLINT |
2 bajty | −32,768 do 32,767 |
INT2 |
SMALLINT |
2 bajty | |
BIGINT |
BIGINT |
8 bajtów | −9 kwintylionów do +9 kwintylionów |
INT8 |
BIGINT |
8 bajtów |
Alias dla liczb dokładnych
| Alias | Prawdziwy typ | Przeznaczenie |
|---|---|---|
DEC |
NUMERIC |
Synonim wg standardu SQL |
DECIMAL |
NUMERIC |
To samo |
Alias dla liczb zmiennoprzecinkowych
| Alias | Prawdziwy typ | Dokładność |
|---|---|---|
FLOAT |
DOUBLE PRECISION |
~15 miejsc (domyślnie) |
FLOAT(24) |
REAL |
~6 miejsc |
FLOAT(53) |
DOUBLE PRECISION |
~15 miejsc |
FLOAT8 |
DOUBLE PRECISION |
Przestarzały alias |
FLOAT4 |
REAL |
Przestarzały alias |
Typowe błędy
Pracując z typami liczbowymi, możesz natknąć się na kilka pułapek:
Wybór zbyt małego typu danych. Jeśli do wieku ludzi używasz SMALLINT, to błąd. Robot z "Matriksu", który ma miliony lat, będzie zawiedziony.
Utrata danych przy zaokrąglaniu. Używając REAL w rozliczeniach finansowych, możesz zgubić grosze. A potem i zaufanie klientów.
Porównywanie różnych typów. Jeśli porównasz INTEGER i REAL, możesz dostać nieoczekiwane wyniki przez specyfikę reprezentacji liczb zmiennoprzecinkowych.
GO TO FULL VERSION