Skip to content

Typy danych PostgreSQL wyjaśnione

Wszystkie typowe typy danych kolumn PostgreSQL pogrupowane według rodziny: liczby całkowite, dziesiętne, tekst, czas, wartości logiczne i UUID, JSON, adresy sieciowe, typy złożone i typy z rozszerzeń. Każdy wiersz pokazuje, co typ przechowuje i kiedy go wybrać.

PostgreSQL ma dziesiątki typów, ale codzienne projektowanie schematów opiera się na wąskim zestawie podstawowych. Powtarzające się wybory to: integer kontra numeric dla liczb, varchar kontra text dla stringów (text zwykle wystarczy), timestamp kontra timestamptz (preferuj timestamptz dla wszystkiego z realnego świata) oraz json kontra jsonb (preferuj jsonb — jest binarny i indeksowalny). Wybierz najbardziej konkretny typ, który nadal pasuje; baza danych wymusi go za ciebie.

Tabela referencyjna · 46 wpisy
46 of 46 rows
Liczby całkowite
Liczba całkowita 2-bajtowa od -32768 do 32767.Rzadko; tylko gdy musisz oszczędzić miejsce.
Liczba całkowita 4-bajtowa, około plus/minus 2 miliardy.Domyślna kolumna na liczby całkowite.
Liczba całkowita 8-bajtowa, około plus/minus 9 trylionów.Bardzo duże liczniki lub zewnętrzne identyfikatory.
Automatycznie rosnąca liczba całkowita 4-bajtowa.Starsze klucze z autonumeracją; od PG 10 zalecanym następcą jest GENERATED AS IDENTITY.
Warianty 2- i 8-bajtowe serial.Autonumeracja dopasowana do kolumny smallint lub bigint.
Liczba całkowita generowana przez tabelę (GENERATED ALWAYS AS IDENTITY).Nowoczesny serial; zgodny ze standardem SQL i bezpieczniejszy przy ręcznych wstawieniach.
Ułamki dziesiętne i zmiennoprzecinkowe
Dokładne liczby dziesiętne o dowolnej precyzji.Pieniądze i wszystko, gdzie błędy zaokrągleń są niedopuszczalne.
Liczba zmiennoprzecinkowa 4-bajtowa pojedynczej precyzji.Przybliżone wartości naukowe, gdzie precyzja nie jest krytyczna.
Liczba zmiennoprzecinkowa 8-bajtowa podwójnej precyzji.Dane geoprzestrzenne, statystyka i wartości cech ML.
Kwota w walucie ze stałym locale.Rzadko; numeric z kodem waluty po stronie aplikacji jest bardziej przenośny.
Tekst
Tekst o stałej długości, wypełniany spacjami.Kody o znanej szerokości; rzadko potrzebne.
Tekst o zmiennej długości z opcjonalnym limitem.Ograniczone stringi, np. nazwy użytkowników lub e-maile.
Tekst o zmiennej długości bez limitu.Uniwersalna kolumna tekstowa; bez kary wydajnościowej względem varchar.
Czas
Data kalendarzowa bez pory dnia.Urodziny i terminy.
Pora dnia, ze strefą czasową lub bez.Codzienne alarmy lub godziny otwarcia.
Data i czas bez strefy czasowej.Starsze schematy; unikaj w nowych projektach.
Data i czas przechowywane jako UTC, pokazywane w strefie klienta.Domyślny wybór dla każdego realnego momentu; preferuj zamiast timestamp.
Okres czasu, np. 2 dni lub 3 godziny.Czas trwania i arytmetyka dat.
Boolean, UUID i bajty
Prawda lub fałsz.Flagi i przełączniki.
128-bitowy uniwersalny unikalny identyfikator.Nieprzewidywalne identyfikatory bezpieczne do ujawnienia (generuj w aplikacji lub przez gen_random_uuid).
Surowe bajty binarne.Bloby, obrazy i nieprzezroczyste dane; duże pliki trzymaj w object storage.
Ciągi bitów o stałej lub zmiennej długości.Spakowane flagi i pola protokołów; pojedyncza wartość wł./wył. to nadal boolean.
JSON i dane półstrukturalne
JSON parsowany do binarnej, indeksowalnej postaci.Elastyczne lub zagnieżdżone dane; zalecana kolumna JSON (obsługuje indeksy GIN).
JSON przechowywany jako oryginalny tekst.Rzadko; tylko gdy musisz zachować kolejność kluczy lub dokładne białe znaki.
Tekst XML.Starsze integracje wymagające XML.
Skompilowane wyrażenie ścieżki do nawigacji po danych JSON.Filtrowanie w jsonb przez jsonb_path_query i operatory SQL/JSON.
Sieć i wyszukiwanie
Adres hosta IPv4 lub IPv6.Przechowywanie IP klientów lub serwerów.
Blok sieci IP, np. 10.0.0.0/24.Reguły firewalla i zakresy podsieci.
Adres MAC 6- lub 8-bajtowy (EUI-64).Identyfikatory urządzeń i interfejsów sieciowych.
Wstępnie przetworzony tekst do wyszukiwania pełnotekstowego.Wbudowane wyszukiwanie Postgresa, zanim sięgniesz po osobną wyszukiwarkę.
Terminy wyszukiwania łączone operatorami AND, OR i prefiksu.Część zapytania wyszukiwania pełnotekstowego, dopasowywana do tsvector przez @@.
Pozycja w dzienniku write-ahead, numer sekwencyjny loga.Monitorowanie opóźnienia replikacji i kopii zapasowych.
Typy złożone i zaawansowane
Tablica dowolnego typu bazowego, np. integer[].Listy prostych wartości; gdy elementy potrzebują własnych kolumn, użyj tabeli potomnej.
Jedna wartość ze zdefiniowanej przez ciebie stałej listy.Pola statusu o stabilnym zbiorze opcji.
Własny typ wierszowy z kilku pól.Powtarzające się grupy pól współdzielone między tabelami.
Ciągły zakres między dwiema granicami.Grafiki, przedziały cen i zakresy wersji, z operatorami nakładania.
Typ bazowy opakowany w zdefiniowane przez ciebie ograniczenia.Wielokrotnego użytku reguły, np. niepusty e-mail, wymuszane w każdej kolumnie, która go używa.
Nienazwany wiersz wartości o określonych typach.Wartości zwracane przez funkcje PL/pgSQL i pośrednie wyniki zapytań.
Wbudowane dwuwymiarowe wartości geometryczne.Prosta geometria płaszczyzny; realne lokalizacje wymagają PostGIS.
Bezznakowy 4-bajtowy identyfikator obiektu systemowego.Złączanie katalogów systemowych; nie do kolumn aplikacyjnych.
Wewnętrzny identyfikator tekstowy do 63 znaków.Zapytania do katalogów; zwykły text dla wszystkiego widocznego dla użytkownika.
Typy z rozszerzeń
Pary klucz/wartość tekstowe w jednej wartości (rozszerzenie).Płaskie mapy; jsonb obsługuje to dziś lepiej.
Hierarchiczna ścieżka etykiet, np. news.tech.ai (rozszerzenie).Drzewa z zapytaniami o przodków i potomków.
Tekst porównywany bez rozróżniania wielkości liter (rozszerzenie).Unikalność bez rozróżniania wielkości liter, np. e-maile, bez indeksu lower().
Obiekty geograficzne i geometryczne z rozszerzenia PostGIS.Zapytania o odległość, zawieranie i indeksy przestrzenne.
Funkcje rozszerzenia generujące wartości UUID.Starsza generacja; od PG 13 wbudowana jest gen_random_uuid().