L  i  n  u  x    P  a  r  k
при поддержке ВебКлуба

Глава 3. Типы данных

Содержание
Числовые типы
Денежный тип
Символьные типы
Типы даты/времени
Булевский тип
Геометрические типы
Сети IP версии 4 и адреса хостов

Описываются встроенные типы данных, существующие в Postgres-е.

Postgres имеет богатый набор встроенных типов данных, доступных пользователям. Пользователи могут добавлять новые типы к Postgres-у используя команду DEFINE TYPE, описанную всюду.

В контексте типов данных, в следующих секциях будет обсуждаться соответствие стандартам SQL, портирование выпусков и использование. Некоторые типы в Postgres-е прямо соответствуют SQL92-совместимым типам. В других случаях, типы данных определенные с помощью синтаксиса SQL92 напрямую проецируются на встроенные в Postgres типы. Многие из встроенных типов имеют очевидный внешний формат. Однако, некоторые типы являются также уникальными для Postgres-а, такие как открытый и закрытый пути, или имеют особые возможности для форматов, такие как типы даты и времени.

Таблица 3-1. Типы данных в Postgres

Типы в Postgres Типы в SQL92 или SQL3 Описание
bool boolean Логический булевский (true/false)
box   Прямоугольный бокс на 2-х мерной плоскости
char(n) character(n) Символьная строка фиксированной длины
cidr   Сетевой или хост-адрес IP версии 4
circle   Круг на 2-х мерной плоскости
date date Календарная дата без времени суток
float4/8 float(p) Число с плавающей запятой с точностью p
float8 real, double precision Число с плавающей запятой с двойной точностью
inet   Сетевой или хост-адрес IP версии 4
int2 smallint Целое знаковое двухбайтное число
int4 int, integer Целое знаковое 4-х байтное число
int4 decimal(p,s) Число с точностью p <= 9, s = 0
int4 numeric(p,s) Число с точностью p == 9, s = 0
int8   Знаковое целое 8-и байтное число
line   Бесконечная линия на 2-х мерной плоскости
lseg   Сегмент линии на 2-х мерной плоскости
money decimal(9,2) Валюта в стиле US
path   Открытый и закрытый геометрический путь на 2-х мерной плоскости
point   Геометрическая точка на 2-х мерной плоскости
polygon   Закрытый геометрический путь на 2-х мерной плоскости
serial   Уникальный идентификатор для индексации и перекрестных ссылок
time time Время суток
timespan interval Временной интервал для общего использования
timestamp timestamp with time zone Дата / время
varchar(n) character varying(n) Символьная строка переменной длины

Предупреждение: cidr и inet типы сконструированы для работы с любым типом IP, но в настоящей реализации обрабатывается только ipv4. Здесь все, что говорится об ipv4, сможет применяться и к ipv6 в будущих выпусках.

Таблица 3-2. Функции и константы в Postgres

Функции в Postgres Константы в SQL92 Описание
getpgusername() current_user Имя пользователя в текущей сессии
date('now') current_date Дата текущей транзакции
time('now') current_time Время текущей транзакции
timestamp('now') current_timestamp Дата и время текущей транзакции

Postgres имеет свойства, присущие передовой линии разработок ORDBMS. В дополнение к соответствию SQL3, поддерживаются также существенные порции SQL92. Несмотря на прилагаемые усилия для соответствия SQL92, существует несколько аспектов стандарта, которые недостаточно рассматривались и которые не выжили бы в последующих стандартах. В дальнейшем в Postgres-е не будет прилагаться особых усилий для соответствия этим свойствам; однако, они бывают необходимы для применения в редко используемых или сложных случаях, и типичный пользователь вряд ли захочет иметь с ними дело.

Большинство функций ввода и вывода, относящихся к базовым типам (то есть, целочисленным и числам с плавающей запятой) производят некоторую проверку ошибок. Некоторые из операторов и функций (то есть, сложение и умножение) не выполняют проверки ошибок во время выполнения с целью повышения скорости выполнения. На некоторых системах, например, числовые операторы для некоторых типов данных могут незаметно выходить за пределы верхней или нижней границ.

Заметим, что некоторые из функций ввода и вывода не инвертируемы. То есть, результат функции вывода может потерять точность в сравнении с оригинальным вводом.

Замечание: Оригинальный код Postgres v4.2, полученный из Беркли округлял все результаты с плавающей запятой двойной точности до шести цифр для вывода. Начиная с v6.1, в числах с плавающей запятой стало возможным сохранение внутренней точности для большинства типов (типичный пример - 15 цифр для двойной точности, 6 цифр для 4-х байтных чисел с плавающей запятой). Другие типы с лежащими в основании полями с плавающей запятой (то есть, геометрическими типами) содержат аналогичную точность.

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

Числовые типы состоят из двух- и четырехбайтных целых чисел и четырех- и восьмибайтных чисел с плавающей запятой.

Table 3-3. Числовые типы в Postgres

Числовой тип Хранение Описание Интервал
float4 4 bytes Переменная точность 6 десятичных мест
float8 8 bytes Переменная точность 15 десятичных мест
int2 2 bytes Фиксированная точность От -32768 до +32767
int4 4 bytes Обычный выбор для фиксированной точности От -2147483648 до +2147483647
int8 8 bytes Очень большой промежуток для фиксированной точности +/- > 18 десятичных мест
serial 4 bytes Идентификатор или перекрестная ссылка От 0 до +2147483647

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

Тип serial является особым типом, сконструированным в Postgres-е из других существующих компонентов. В типичном случае он используется для создания уникальных идентификаторов табличных входов. В настоящей реализации задание

CREATE TABLE tablename (colname SERIAL);
является эквивалентным заданию:
CREATE SEQUENCE tablename_colname_seq;
CREATE TABLE tablename
    (colname INT4 DEFAULT nextval('tablename_colname_seq');
CREATE UNIQUE INDEX tablename_colname_key on tablename (colname);
Предупреждение

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

CREATE TABLE tablename (colname SERIAL);
DROP TABLE tablename;
CREATE TABLE tablename (colname SERIAL);
Последовательность будет оставаться в базе данных пока полностью не удалится использованием команды DROP SEQUENCE.

Тип int8 может быть недоступен на всех платформах, поскольку он зависит от поддержки компилятора для этого свойства.

Денежный тип

Денежный тип поддерживает валюту в стиле США с представлением фиксированной десятичной точки. Если Postgres компилируется с USE_LOCALE, то денежный тип будет использовать денежные соглашения, определенные для locale(7).

Таблица 3-4. Денежные типы в Postgres

Денежный тип Хранение Описание Интервал
money 4 bytes Фиксированная точность От -21474836.48 до +21474836.47

Тип numeric заменит денежный тип и будет предпочтительнее.

Символьные типы

SQL92 определяет два первичных символьных типа: char и varchar. Postgres поддерживает эти типы, в добавление к более общему типу text, который в отличие от varchar не требует объявления верхнего предела для размера поля.

Таблица 3-5. Символьные типы в Postgres

Символьный тип Хранение Рекомендация Описание
char 1 byte SQL92-совместимый Одиночный символ
char(n) (4+n) bytes SQL92-совместимый Фиксированной длины, дополненный пробелами
text (4+x) bytes Лучший выбор Переменной длины
varchar(n) (4+n) bytes SQL92-совместимый Переменной длины с пределом

Существует еще один символьный тип фиксированной длины. Тип name имеет только одно назначение, которым является предоставление Postgres-у специального типа для хранения внутренних имен. В общем, он не предназначен для использования пользователем. Его длина в настоящем определена равной 32 символам, но к ней можно обратиться, используя NAMEDATALEN. Это устанавливается во время компиляции и может быть изменено в будущем выпуске.

Таблица 3-6. Особенность символьного типа в Postgres

Символьный тип Хранение Описание
name 32 bytes Внутренний тип длиной 32 символа