В PostgreSQL важно знать про типы данных. Каждая колонка в таблице имеет свой тип и может хранить только определённые данные. В PostgreSQL все типы данных можете посмотреть тут. Здесь рассмотрим лишь некоторые.

Числовые типы

ИмяРазмерОписаниеДиапазонПример
integer2 байтаОтрицательное или положительное целое число.от -2147483648
до +2147483647
516
numeric(m, n)переменныйВещественное число с фиксированной точностью.

Точность для этого типа настраиваемая, это значит, что её можно указать с помощью точности (m) и масштаба (n). Точность — общее количество цифр, масштаб — количество цифр после запятой.

Например число 468,45 — NUMERIC(5, 2).

Можно задать только точность, например NUMERIC(3), тогда масштаб станет равен 0.

На самом деле точность и масштаб можно не задавать. В таком случае можно будет сохранить число с любой точностью и масштабом в рамках ограничений.

Этот тип применяется для чисел, где важна точность, например для хранения денежных сумм.
131072 цифр до точки

16383 цифр после точки
12,12958
real4 байтаЧисло с плавающей точкой. Как следствие точность меньше чем у numeric, зато вычисления происходят быстрее.6 цифр после точки56,13
serial4 байтаЦелое число из последовательности, то есть оно автоматически увеличивается для каждой новой строки.

Проще говоря, создавая этот тип для столбца, вам не нужно придумывать значения в нём. Так как за вас это сделает система.

Этот тип гарантирует уникальность в рамках диапазона.
от 1
до 2147483647
50
money8 байтТип для хранения денежной суммы.от -92233720368547​758.08

до +92233720368547​758.07
100,50
# CREATE TABLE test
(integer integer,
numeric numeric(4,3),
real real,
serial serial,
money money);

# INSERT INTO test (integer, numeric, real, money) VALUES
(123, 1.343, 1233.2, 245.65);
INSERT 0 1

# SELECT * FROM test;
 integer | numeric |  real  | serial |  money
---------+---------+--------+--------+----------
     123 |   1.343 | 1233.2 |      1 | 245,65 ₽
(1 row)

Из вывода выше стоит отметить, что в примере выше мы не вставляли значение в колонку serial, система это проделала за нас. А также в колонке money при выводе мы видим знак денежной единицы.

Строки

ИмяОписаниеПример
varchar(n)Строка переменной длины, но не длиннее «n».abc
char(n)Строка фиксированной длины, длинной «n».abc
textСтрока неограниченной и переменной длины.abcde
# CREATE TABLE text
(varchar varchar(5),
char char(3),
text text);

# INSERT INTO text (varchar, char, text) VALUES
('abc', 'abc', 'hello word'),
('abcde', 'abc', 'by-by');

# SELECT * FROM text;
 varchar | char |    text
---------+------+------------
 abc     | abc  | hello word
 abcde   | abc  | by-by
(2 rows)

В результате в varchar можно записать любую строку не более 5 символов, в char строка должна быть ровно 3 символа, а в text можем записать строку любой длины.

Дата и время

ИмяРазмерОписаниеДиапазонТочностьПример
timestamp8 байтДата и времяот 4713 года до нашей эры
до 294276 года нашей эры
1 микросекунда2021-07-13 14:21:41
timestamptz8 байтДата и время с часовым поясомот 4713 года до нашей эры
до 294276 года нашей эры
1 микросекунда2021-07-13 14:21:41+03
date4 байтаДата
год-месяц-число
от 4713 года до нашей эры
до 5874897 года нашей эры
1 день2021-07-13
time8 байтВремяот 00:00:00
до 24:00:00
1 микросекунда14:21:41
# CREATE TABLE time
(timestamp timestamp,
timestamptz timestamptz,
date date,
time time);

# SELECT now();
              now
-------------------------------
 2021-07-13 14:21:41.406081+03

# INSERT INTO time (timestamp, timestamptz, date, time) VALUES
('2021-07-13 14:21:41', '2021-07-13 14:21:41 +03', '2021-07-13', '14:21:41');

# INSERT INTO time (timestamp, timestamptz, date, time) VALUES
(now(), now(), now(), now());

# SELECT * FROM time;
         timestamp          |          timestamptz          |    date    |      time
----------------------------+-------------------------------+------------+-----------------
 2021-07-13 14:21:41        | 2021-07-13 14:21:41+03        | 2021-07-13 | 14:21:41
 2021-07-13 14:29:43.235957 | 2021-07-13 14:29:43.235957+03 | 2021-07-13 | 14:29:43.235957
(3 rows)

Функция now() возвращает текущее время в формате timestamptz, но помещая вывод этой функции в различные типы данных, возвращаемое значение подстраивается под конкретный тип данных.

Логический тип

ИмяРазмерОписаниеДиапазонПример
boolean1 байтИстина или ложtrue или falsetrue
# CREATE TABLE boolean
(name varchar(15),
date date,
attended boolean);

# INSERT INTO boolean (name, date, attended) VALUES
('alex', '2021-06-15', true),
('bob', '2021-06-15', false);

# SELECT * FROM boolean;
 name |    date    | attended
------+------------+----------
 alex | 2021-06-15 | t
 bob  | 2021-06-15 | f
(2 rows)

В примере выше в колонке attended (присутствовал) мы указываем:

  • true — если человек в эту дату присутствовал где-то;
  • false — если не присутствовал.

Сетевые адреса

ИмяРазмерОписаниеПример
inet7 или 19 байтУзлы и сети IPv4 и IPv6192.168.0.1/24
192.168.0.0/24
cidr7 или 19 байтСети IPv4 и IPv6192.168.0.0/24
macaddr6 байтMAC-адреса’08:00:2b:01:02:03′
macaddr88 байтMAC-адреса (в формате EUI-64)’08:00:2b:01:02:03:04:05′
# CREATE TABLE network
(hostname varchar(10),
ip_address inet);

# INSERT INTO network (hostname, ip_address) VALUES
('gateway', '192.168.0.1/24'),
('pc-alex', '192.168.0.5/24'),
('pc-bob', '192.168.0.15/24');

# SELECT * FROM network;
 hostname |   ip_address
----------+-----------------
 gateway  | 192.168.0.1/24
 pc-alex  | 192.168.0.5/24
 pc-bob   | 192.168.0.15/24

Здесь стоит отметить что в cidr значение должно заканчиваться нулями (192.168.0.0/24), а в inet это не обязательно.

Уникальный идентификатор

ИмяОписаниеПример
uuid128-битное значение, генерируемое специальным алгоритмом, практически гарантирующим, что этим же алгоритмом оно не будет получено больше нигде в мире.

Записывается в виде 32 шестнадцатеричных цифр, разделённых на несколько групп. 
a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11
# CREATE TABLE uid
(uid uuid, name varchar(15));

# INSERT INTO uid (uid, name) VALUES
(gen_random_uuid (), 'alex'), (gen_random_uuid (), 'bob'), (gen_random_uuid (), 'max');

# SELECT * FROM uid;
                 uid                  | name
--------------------------------------+------
 650d3f16-c81c-4bbb-83a8-1964a6d2912e | alex
 7eb5cf8e-9755-48b3-8e66-753a09c6a7ed | bob
 b7837e0a-3519-4812-89f1-c7a9784406a3 | max
(3 rows)

Функция gen_random_uuid () предназначена для генерирования уникального uuid. Хотя есть мизерная вероятность что будет сгенерирован неуникальный uuid.


Существуют и другие типы, например для хранения двоичных данных, json, массивов, xml и другой информации. Но так как я их не применял, то и описывать пока не буду.

Сводка
Типы данных PostgreSQL
Имя статьи
Типы данных PostgreSQL
Описание
В PostgreSQL важно знать про типы данных. Каждая колонка в таблице имеет свой тип и может хранить только данные определенного типа. Рассмотрим основные типы

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *