СУБД PostgreSQL: Типи даних
PostgreSQL має багатий набір типів даних, доступних для користувачів.
Користувачі можуть додавати нові типи до PostgreSQL за допомогою команди CREATE TYPE
.
CREATE TYPE book_genre AS ENUM (
'Adventure',
'Biography',
'Comedy',
'Crime',
'Drama',
'Fantasy',
'Historical Fiction',
'Horror',
'Mystery',
'Poetry',
'Romance',
'Science Fiction',
'Self-Help',
'Thriller',
'Young Adult'
);
Назва |
Псевдоніми |
Опис |
---|---|---|
|
|
знакове восьмибайтне ціле число |
|
|
автоінкрементоване восьмибайтне ціле число |
|
бітовий рядок фіксованої довжини |
|
|
|
бітовий рядок змінної довжини |
|
|
логічний тип даних (true/false) |
|
прямокутник на площині |
|
|
двійкові дані («байтовий масив») |
|
|
|
символьний рядок фіксованої довжини |
|
|
символьний рядок змінної довжини |
|
Мережева адреса IPv4 або IPv6 |
|
|
коло на площині |
|
|
|
число з плаваючою комою подвійної точності (8 байт) |
|
календарна дата (рік, місяць, день) |
|
|
IPv4 або IPv6 адреса хосту |
|
|
|
знакове чотирибайтне ціле число |
|
проміжок часу |
|
|
текстові дані JSON |
|
|
двійкові дані JSON, декомпоновані |
|
|
нескінченна пряма на площині |
|
|
відрізок прямої на площині |
|
|
MAC-адреса (Media Access Control) |
|
|
MAC-адреса (Media Access Control) (формат EUI-64) |
|
|
сума валюти |
|
|
|
точне число з обраною точністю |
|
геометричний шлях на площині |
|
|
Номер послідовності журналу PostgreSQL |
|
|
знімок ідентифікатора транзакції на рівні користувача |
|
|
геометрична точка на площині |
|
|
замкнений геометричний шлях на площині |
|
|
|
число з плаваючою комою одинарної точності (4 байти) |
|
|
знакове двобайтне ціле число |
|
|
автоінкрементоване двобайтне ціле число |
|
|
автоінкрементоване чотирибайтне ціле число |
|
символьний рядок змінної довжини |
|
|
час доби (без часового поясу) |
|
|
|
час доби, включаючи часовий пояс |
|
дата і час (без часового поясу) |
|
|
|
дата і час, включаючи часовий пояс |
|
текстовий пошуковий запит |
|
|
текстовий пошуковий документ |
|
|
знімок ідентифікатора транзакції на рівні користувача (застарілий; див. pg_snapshot) |
|
|
універсальний унікальний ідентифікатор |
|
|
XML-дані |
Перетворення типів
SQL - це мова сильних типів. Це означає, що кожен елемент даних має асоційований тип даних, який визначає його поведінку та дозволене використання. PostgreSQL має розширювану систему типів, яка є більш загальною і гнучкою, ніж інші реалізації SQL.
Ви можете приводити деякі типи на місці, використовуючи нотацію ::
, наприклад:
SELECT '42'::INT;
SELECT '24.5'::REAL;
SELECT 'today'::DATE;
SELECT 'tomorrow'::TIMESTAMP;
Числові типи
Числові типи складаються з двох-, чотирьох- і восьмибайтових цілих чисел, чотирьох- і восьмибайтових чисел з плаваючою комою та десяткових чисел з довільною точністю.
Типи smallint
, integer
і bigint
зберігають цілі числа, тобто числа без дробової частини, різних діапазонів. Спроби зберігати значення, що виходять за межі допустимого діапазону, призведуть до помилки.
Назва |
Розмір |
Опис |
Діапазон |
---|---|---|---|
smallint |
2 байти |
ціле число малого діапазону |
-32768 до +32767 |
integer |
4 байти |
типовий вибір для цілого числа |
-2147483648 до +2147483647 |
bigint |
8 байт |
ціле число великого діапазону |
-9223372036854775808 до +9223372036854775807 |
decimal |
змінна |
задана користувачем точність, точна |
до 131072 знаків до десяткової крапки; до 16383 знаків після десяткової крапки |
numeric |
змінна |
задана користувачем точність, точна |
до 131072 знаків до десяткової крапки; до 16383 знаків після десяткової крапки |
real |
4 байти |
змінної точності, неточний |
6 десяткових знаків після коми |
double precision |
8 байт |
змінної точності, неточний |
точність до 15 знаків після коми |
smallserial |
2 байти |
невелике ціле число, що автоматично збільшується |
1 до 32767 |
serial |
4 байти |
автоінкрементоване ціле число |
1 до 2147483647 |
bigserial |
8 байт |
велике ціле число, що автоматично збільшується |
1 до 9223372036854775807 |
Символьні типи
Назва |
Опис |
---|---|
|
змінної довжини з обмеженням |
|
фіксованої довжини, пустотілі |
|
змінна необмеженої довжини, без обрізів |
|
змінна необмеженої довжини |
У мові SQL визначено два основних типи символів: character varying(n)
та character(n)
, де n
- натуральне число. Обидва ці типи можуть зберігати рядок довжиною до n
символів. Спроба зберегти довший рядок у стовпці цих типів призведе до помилки, якщо тільки всі надлишкові символи не є пробілами, у цьому випадку рядок буде урізано до максимальної довжини. Однак, якщо явно привести значення до varchar(n)
або char(n)
, то значення надмірної довжини буде урізано до n
символів без виникнення помилки. Якщо рядок, що зберігається, коротший за оголошену довжину, значення типу char
буде доповнено пробілами; значення типу varchar
просто збереже коротший рядок.
Крім того, у postgres передбачено тип text
, який зберігає рядки довільної довжини.
Якщо вказано, довжина n
повинна бути більшою за 0 і не може перевищувати 10 485 760 символів. Якщо character varying
використовується без специфікатора довжини, тип приймає рядки будь-якої довжини. Якщо bpchar
не має специфікатора довжини, він також приймає рядки будь-якої довжини, але кінцеві пробіли є семантично несуттєвими. Якщо character
не має специфікатора, він еквівалентний до character(1)
.
Типи дати/часу
PostgreSQL підтримує повний набір типів дати і часу SQL. Дати відраховуються за григоріанським календарем, навіть у роки, коли цей календар ще не було запроваджено.
time
, timestamp
та interval
приймають необов’язкове значення точності, яке визначає кількість дробових знаків, що зберігаються у полі секунд. За замовчуванням, немає явного обмеження на точність. Допустиме значення цього параметра - від 0 до 6.
Тип інтервал
має додаткову опцію, яка полягає в обмеженні полів, що зберігаються, шляхом написання однієї з цих фраз:
YEAR
MONTH
DAY
HOUR
MINUTE
SECOND
YEAR TO MONTH
DAY TO HOUR
DAY TO MINUTE
DAY TO SECOND
HOUR TO MINUTE
HOUR TO SECOND
MINUTE TO SECOND
Дати
Деякі можливі вхідні дані для типу date
.
Приклад |
Опис |
---|---|
|
ISO 8601; 8 січня в будь-якому режимі (рекомендований формат) |
|
однозначний у будь-якому режимі введення стилю дати |
|
8 січня в режимі MDY; 1 серпня в режимі DMY |
|
18 січня в режимі MDY; відхилено в інших режимах |
|
2 січня 2003 року в режимі MDY; 1 лютого 2003 року в режимі DMY; 3 лютого 2001 року в режимі YMD |
|
8 січня в будь-якому режимі |
|
8 січня в режимі YMD, інакше помилка |
|
8 січня, крім помилки в режимі YMD |
|
ISO 8601; 8 січня 1999 року в будь-якому режимі |
|
рік та день року |
|
Дата за юліанським календарем |
|
99 рік до н.е |
Час
Деякі можливі вхідні дані для типу time
.
Приклад |
Опис |
---|---|
|
ISO 8601 |
|
те саме, що і 04:05; AM не впливає на значення |
|
збігається з 16:05; вхідна година повинна бути <= 12 |
|
ISO 8601, з часовим поясом відносно UTC |
|
ISO 8601, з часовим поясом у дробових годинах відносно UTC |
|
Зміщення UTC вказано в секундах (не дозволено в ISO 8601) |
|
часовий пояс, вказаний абревіатурою |
|
часовий пояс вказано повністю |
Введення часового поясу
Приклад |
Опис |
---|---|
|
Скорочення (для Тихоокеанського стандартного часу) |
|
Повна назва часового поясу |
|
Специфікація часових поясів у стилі POSIX |
|
Зміщення відносно UTC для PST |
|
Зміщення відносно UTC для PST (розширений формат ISO 8601) |
|
Зміщення відносно UTC для PST (базовий формат ISO 8601) |
|
Зміщення відносно UTC для PST (базовий формат ISO 8601) |
|
Військове скорочення UTC |
|
Коротка форма зулу (також в ISO 8601) |
Спеціальне введення дати/часу
Вхідний Рядок |
Допустимі Типи |
Опис |
---|---|---|
epoch |
|
1970-01-01 00:00:00+00 (нульовий системний час Unix) |
infinity |
|
пізніше за всі інші часові мітки |
-infinity |
|
раніше за всі інші мітки часу |
now |
|
час початку поточної транзакції |
today |
|
опівночі (00:00) сьогодні |
tomorrow |
|
опівночі (00:00) завтра |
yesterday |
|
опівночі (00:00) вчора |
allballs |
|
00:00:00.00 UTC |
Інтервали
значення interval
можна записати, використовуючи наступний розгорнутий синтаксис:
[@] quantity unit [quantity unit...] [direction]
Інтервали корисні, коли вам потрібно перемістити мітку часу в минуле або в майбутнє.
Абревіатура |
Значення |
---|---|
Y |
Роки |
M |
Місяці |
W |
Тижні |
D |
Дні |
H |
Години |
M |
Хвилини |
S |
Секунди |
SELECT 'yesterday'::TIMESTAMP + INTERVAL '7d ago';
SELECT 'yesterday'::TIMESTAMP - INTERVAL '7' DAY;
Логічний тип
PostgreSQL надає стандартний тип SQL boolean
. Тип boolean
може мати декілька станів: true, false і третій стан, unknown, який представляється значенням SQL NULL
.
Функція введення типу даних для типу boolean
приймає ці представлення рядків для стану true:
true
yes
on
1
і ці представлення для стану false:
false
no
off
0
Ключові слова TRUE
або FALSE
є найкращим (SQL-сумісним) методом запису булевих констант у SQL-запитах. Але ви також можете використовувати рядкові представлення, дотримуючись загального синтаксису рядково-літерних констант, наприклад, 'yes'::boolean
.
Перераховані типи
Перечислювальні типи - це типи даних, які складаються зі статичного, впорядкованого набору значень. Вони еквівалентні типам список
, що підтримуються у багатьох мовах програмування. Прикладом перечислення можуть бути дні тижня або набір значень статусу елемента даних.
Типи перечислення створюються за допомогою команди CREATE TYPE
; і після створення тип перечислення можна використовувати у таблицях та визначеннях функцій, як і інші типи:
CREATE TYPE WORK_DAY AS ENUM ('mon', 'tue', 'wed', 'thu', 'fri');
CREATE TABLE work_log
(
amount INTEGER,
date DATE,
day WORK_DAY
);
Упорядкування
Порядок значень у типі enum - це порядок, у якому значення були перераховані при створенні типу. Усі стандартні оператори порівняння та пов’язані з ними агрегатні функції підтримуються для перелічуваних типів. Однак пам’ятайте, що кожен перелічуваний тип даних є окремим і не може порівнюватися з іншими перелічуваними типами.