В PostgreSQL важно знать про типы данных. Каждая колонка в таблице имеет свой тип и может хранить только определённые данные. В PostgreSQL все типы данных можете посмотреть тут. Здесь рассмотрим лишь некоторые.
Числовые типы
Имя | Размер | Описание | Диапазон | Пример |
integer | 2 байта | Отрицательное или положительное целое число. | от -2147483648 до +2147483647 | 516 |
numeric(m, n) | переменный | Вещественное число с фиксированной точностью. Точность для этого типа настраиваемая, это значит, что её можно указать с помощью точности (m) и масштаба (n). Точность — общее количество цифр, масштаб — количество цифр после запятой. Например число 468,45 — NUMERIC(5, 2). Можно задать только точность, например NUMERIC(3), тогда масштаб станет равен 0. На самом деле точность и масштаб можно не задавать. В таком случае можно будет сохранить число с любой точностью и масштабом в рамках ограничений. Этот тип применяется для чисел, где важна точность, например для хранения денежных сумм. | 131072 цифр до точки 16383 цифр после точки | 12,12958 |
real | 4 байта | Число с плавающей точкой. Как следствие точность меньше чем у numeric, зато вычисления происходят быстрее. | 6 цифр после точки | 56,13 |
serial | 4 байта | Целое число из последовательности, то есть оно автоматически увеличивается для каждой новой строки. Проще говоря, создавая этот тип для столбца, вам не нужно придумывать значения в нём. Так как за вас это сделает система. Этот тип гарантирует уникальность в рамках диапазона. | от 1 до 2147483647 | 50 |
money | 8 байт | Тип для хранения денежной суммы. | от -92233720368547758.08 до +92233720368547758.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 можем записать строку любой длины.
Дата и время
Имя | Размер | Описание | Диапазон | Точность | Пример |
timestamp | 8 байт | Дата и время | от 4713 года до нашей эры до 294276 года нашей эры | 1 микросекунда | 2021-07-13 14:21:41 |
timestamptz | 8 байт | Дата и время с часовым поясом | от 4713 года до нашей эры до 294276 года нашей эры | 1 микросекунда | 2021-07-13 14:21:41+03 |
date | 4 байта | Дата год-месяц-число | от 4713 года до нашей эры до 5874897 года нашей эры | 1 день | 2021-07-13 |
time | 8 байт | Время | от 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, но помещая вывод этой функции в различные типы данных, возвращаемое значение подстраивается под конкретный тип данных.
Логический тип
Имя | Размер | Описание | Диапазон | Пример |
boolean | 1 байт | Истина или лож | true или false | true |
# 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 — если не присутствовал.
Сетевые адреса
Имя | Размер | Описание | Пример |
inet | 7 или 19 байт | Узлы и сети IPv4 и IPv6 | 192.168.0.1/24 192.168.0.0/24 |
cidr | 7 или 19 байт | Сети IPv4 и IPv6 | 192.168.0.0/24 |
macaddr | 6 байт | MAC-адреса | ’08:00:2b:01:02:03′ |
macaddr8 | 8 байт | 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 это не обязательно.
Уникальный идентификатор
Имя | Описание | Пример |
uuid | 128-битное значение, генерируемое специальным алгоритмом, практически гарантирующим, что этим же алгоритмом оно не будет получено больше нигде в мире. Записывается в виде 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 и другой информации. Но так как я их не применял, то и описывать пока не буду.