Типы данных в PostgreSQL
Данные, сохранённые в базе, принадлежат какому-нибудь типу: это может быть целое или вещественное число, строка и т. д.
Тип данных определяет формат записи информации в памяти и доступный диапазон значений. Проще говоря, типы данных влияют на операции, которые этим данным доступны. Числа, которые записаны в базе в виде строк, нельзя сложить, чтобы получить сумму. Поэтому часто приходится менять тип со строкового на числовой и наоборот.
В разных СУБД типы данных могут отличаться, но часто их можно объединить в похожие группы. В PostgreSQL выделяют несколько групп типов данных:
- числовые типы,
- символьные типы,
- логические типы,
- типы для работы с датой и временем,
- специализированные типы для конкретных задач.
Числа и строки встречаются повсеместно. Подсчитывая расходы или набирая текст письма, вы работаете с разными типами данных: числами и строками соответственно.
Логические типы используют для информации, которую можно представить в виде утверждений — истинных или ложных. Представьте, что в базе данных магазина нужно хранить данные об истинности следующих утверждений:
- Заказ доставлен покупателю.
- С поставщиком товара продолжают сотрудничать.
- Работник магазина получил премию.
Такую информацию хранят логические значения. Их ещё называют булевыми в честь математика Джорджа Буля. Таких значений всего два:
TRUE, когда утверждение истинно, и FALSE — когда ложно. В одну группу объединяется несколько типов данных. Например, символьных типов в PostgreSQL несколько: один для небольших строк, другой — для объёмных текстов и т. д.
Казалось бы, зачем столько. Но разные типы пригодятся для конкретных задач. Незачем использовать тип для больших текстов, если вы храните только электронные адреса покупателей.
Всего в PostgreSQL выделяют более 40 типов данных, но всё многообразие вам не понадобится. Специалист по запросам редко выбирает типы данных самостоятельно, ведь их определяют ещё во время проектирования базы.
В этом уроке мы расскажем об основных типах данных, с которыми специалисты сталкиваются чаще всего.
Числовые типы
Целые и дробные числа относятся к разным типам данных. Дробные числа иначе называют вещественными.
- Тип
integerхранит целые числа от -2147483648 до +2147483647. Для простых задач этого хватает. Тип данныхintegerобозначают либоint, либоint4. Такое обозначение называется псевдонимом. Псевдонимы есть не у всех типов данных, их часто используют по историческим причинам. Да, так действительно написано в документации PostgreSQL. - Тип
realобозначает вещественные числа. У этого типа тоже есть псевдоним —float4.
Обратите внимание на число в конце псевдонима — оно обозначает, сколько байт занимает такой тип. К примеру,
int4 занимает 4 байта.Символьные типы
- Тип
characterсодержит текст фиксированной длины. Его обозначают псевдонимомchar(n). На месте символаnможет стоять любое число. Например, если вместоnподставить4, строка будет состоять только из четырёх символов. Больше нельзя, но меньше можно: недостающие символы будут заполнены пробелами. Если не указыватьn, его значение по умолчанию будет1. - В тип
character varyingвходят тексты нефиксированной длины. Его псевдоним —varchar(n). Значениеnуправляет лимитом строки, но его можно не указывать. - Тип
textсодержит строку любой длины. Такого типа в стандарте SQL нет, но в некоторых СУБД, помимо PostgreSQL, его тоже используют.
Типы для работы с датой и временем
- Тип
timestampсодержит дату и время. Чаще всего дату и время указывают в формате ISO:'YYYY-MM-DD'. Например, 30 июня 2010 года записывают так:'2010-06-30'.В PostgreSQL типовtimestampдва:timestamp with time zone, включающий данные о часовом поясе, иtimestamp without time zone, который данных о часовом поясе не содержит.Часовые пояса указывают по стандарту UTC:'2004-10-19 10:23:54+02'. В часовом поясе UTC+2 находится, например, Калининград. Сравните со значением типаtimestamp without time zone:'2004-10-19 10:23:54'.По стандарту SQL обозначениеtimestampпо умолчанию подразумевает типtimestamp without time zone. Для обозначения типаtimestamp with time zoneв PostgreSQL используют короткую формуtimestamptz. - В тип
dateвходит только дата. Дату можно задавать в любом формате, например,October 19, 2004,2004-Oct-19или даже20041019. - Тип
timeхранит только время и принимает значения от 00:00:00 до 24:00:00. - Тип
intervalиспользуют для обозначения интервала между датами. Задать нужный интервал можно с помощью условных обозначений или в свободной форме. Например, запись'1 12:59:10'обозначает 1 день 12 часов 59 минут 10 секунд.
Логические типы
В PostgreSQL к типу
boolean относят два значения: TRUE и FALSE. Но эти значения можно указывать по-разному.Для
TRUE список аналогий такой: 'true', 't', 'yes', 'y', 'on', '1'.Вместо
FALSE можно написать: 'false', 'f', 'no', 'n', 'off', '0'.Управление типом данных
Поменять тип данных можно сразу при выгрузке. При этом тип данных поля в самой таблице не изменится. В таких случаях используют оператор
CAST:SQL
Из таблицы
track нужно выгрузить поля track_id и album_id. У этих полей числовой тип данных, но выгрузить их нужно в виде текста. Запрос выглядит так:SQL