07. Системы типов данных языка SQL - KattyOG/Database GitHub Wiki

Системы типов данных языка SQL

Все допустимые в SQL типы данных, которые можно использовать при определении столбцов, разбиваются на следующие категории:

  • точные числовые типы (exact numerics);
  • приближенные числовые типы (approximate numerics);
  • типы символьных строк (character strings);
  • типы битовых строк (bit strings);
  • типы даты и времени (datetimes);
  • типы временных интервалов (intervals);
  • булевский тип (Booleans);
  • типы коллекций (collection types);
  • анонимные строчные типы (anonymous row types);
  • типы, определяемые пользователем (user-defined types);
  • ссылочные типы (reference types).

Булевский тип
При определении столбца булевского типа указывается просто спецификация BOOLEAN. Булевский тип состоит из трех значений: true, false и unknown (соответствующие литералы обозначаются TRUE, FALSE и UNKNOWN). Поддерживается возможность построения булевских выражений, которые вычисляются в трехзначной логике.

Типы коллекций
Под термином коллекция обычно понимается одно из следующих образований: массив, список, множество и мультимножество. В варианте SQL:2011 специфицированы только массивы и мультимножества.

Анонимные строчные типы
Анонимный строчный тип – это конструктор типов ROW, позволяющий производить безымянные типы строк (кортежей). При определении столбца, значения которого должны принадлежать некоторому строчному типу, используется конструкция ROW (fld1, fld2, …, fldn ), где каждый элемент fldi , определяющий поле строчного типа, задается в виде тройки fldname, fldtype, fldoptions. В качестве типа данных поля строчного типа можно использовать любой допустимый в SQL тип данных, включая типы коллекций, определяемые пользователями типы и другие строчные типы. Необязательный элемент fldoptions может задаваться для указания применяемого по умолчанию порядка сортировки, если соответствующий подэлемент fldtype указывает на тип символьных строк, а также должен задаваться, если fldtype указывает на ссылочный тип. Степенью строчного типа называется число его полей.

Типы, определяемые пользователем
Эта категория типов данных связана с объектными расширениями языка SQL. Различают:

  • Структурные типы (Structured Types). Можно определить долговременный хранимый, именованный тип данных, включающий один или более атрибутов любого из допустимых в SQL типа данных, в том числе другие структурные типы, типы коллекций, строчные типы и т. д. Стандарт SQL не накладывает ограничений на сложность получаемой в результате структуры данных, однако не запрещает устанавливать такие ограничения в реализации. Дополнительные механизмы определяемых пользователями методов, функций и процедур позволяют определить поведенческие аспекты структурного типа.
  • Индивидуальные типы (Distinct Types). Можно определить долговременно хранимый, именованный тип данных, опираясь на единственный предопределенный тип. Например, можно определить индивидуальный тип данных PRICE, опираясь на тип DECIMAL (5, 2). Тогда значения типа PRICE представляются точно так же, как значения типа DECIMAL (5, 2). В существующем стандарте индивидуальный тип не наследует от своего опорного типа набор операций над значениями. Например, чтобы сложить два значения типа PRICE требуется явно сообщить системе, что с этими значениями нужно обращаться как со значениями типа DECIMAL (5, 2). Другая возможность состоит в явном определении методов, функций и процедур, связанных с данным индивидуальным типом. Похоже, что в будущих версиях стандарта появятся и другие, более удобные возможности.

Ссылочные типы
Эта категория типов данных связана с объектными расширениями языка SQL. Обеспечивается механизм конструирования типов (ссылочных типов), которые могут использоваться в качестве типов столбцов некоторого вида таблиц (типизированных таблиц). Фактически значениями ссылочного типа являются строки соответствующей типизированной таблицы. Более точно, каждой строке типизированной таблицы приписывается уникальное значение (нечто вроде первичного ключа, назначаемого системой или приложением), которое может использоваться в методах, определенных для табличного типа, для уникальной идентификации строк соответствующей таблицы. Эти уникальные значения называются ссылочными значениями, а их тип – ссылочным типом. Ссылочный тип может содержать только те значения, которые действительно ссылаются на экземпляры указанного типа (т. е. на строки соответствующей типизированной таблицы).

Типы данных PostgreSQL

Числовые типы данных

  • serial: представляет автоинкрементирующееся числовое значение, которое занимает 4 байта и может хранить числа от 1 до 2147483647. Значение данного типа образуется путем автоинкремента значения предыдущей строки. Поэтому, как правило, данный тип используется для определения идентификаторов строки.

  • smallserial: представляет автоинкрементирующееся числовое значение, которое занимает 2 байта и может хранить числа от 1 до 32767. Аналог типа serial для небольших чисел.

  • bigserial: представляет автоинкрементирующееся числовое значение, которое занимает 8 байт и может хранить числа от 1 до 9223372036854775807. Аналог типа serial для больших чисел.

  • smallint: хранит числа от -32768 до +32767. Занимает 2 байта. Имеет псевдоним int2.

  • integer: хранит числа от -2147483648 до +2147483647. Занимает 4 байта. Имеет псевдонимы int и int4.

  • bigint: хранит числа от -9223372036854775808 до +9223372036854775807. Занимает 8 байт. Имеет псевдоним int8.

  • numeric: хранит числа с фиксированной точностью, которые могут иметь до 131072 знаков в целой части и до 16383 знаков после запятой.

  • decimal: хранит числа с фиксированной точностью, которые могут иметь до 131072 знаков в целой части и до 16383 знаков в дробной части. То же самое, что и numeric.

  • real: хранит числа с плавающей точкой из диапазона от 1E-37 до 1E+37. Занимает 4 байта. Имеет псевдоним float4.

  • double precision: хранит числа с плавающей точкой из диапазона от 1E-307 до 1E+308. Занимает 8 байт. Имеет псевдоним float8.

Типы для работы с валютой (денежными единицами)

Для работы с денежными единицами определен тип money, который может принимать значения в диапазоне от -92233720368547758.08 до +92233720368547758.07 и занимает 8 байт.

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

  • character(n): представляет строку из фиксированного количества символов. С помощью параметра задается задается количетво символов в строке. Имеет псевдоним char(n).

  • character varying(n): представляет строку из фиксированного количества символов. С помощью параметра задается задается количетво символов в строке. Имеет псевдоним varchar(n).

  • text: представляет текст произвольной длины.

Бинарные данные

Для хранения бинарных данных определен тип bytea. Он хранит данные в виде бинарных строк, которые представляют последовательность октетов или байт.

Типы для работы с датами и временем

  • timestamp: хранит дату и время. Занимает 8 байт. Для дат самое нижнее значение - 4713 г до н.э., самое верхнее значение - 294276 г н.э.

  • timestamp with time zone: то же самое, что и timestamp, только добавляет данные о часовом поясе.

  • date: представляет дату от 4713 г. до н.э. до 5874897 г н.э. Занимает 4 байта.

  • time: хранит время с точностью до 1 микросекунды без указания часового пояса. Принимает значения от 00:00:00 до 24:00:00. Занимает 8 байт.

  • time with time zone: хранит время с точностью до 1 микросекунды с указанием часового пояса. Принимает значения от 00:00:00+1459 до 24:00:00-1459. Занимает 12 байт.

  • interval: представляет временной интервал. Занимает 16 байт.

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

Тип boolean может хранить одно из двух значений: true или false.
Вместо true можно указывать следующие значения: TRUE, 't', 'true', 'y', 'yes', 'on', '1'.
Вместо false можно указывать следующие значения: FALSE, 'f', 'false', 'n', 'no', 'off', '0'.

Типы для представления интернет-адресов

  • cidr: интернет-адрес в формате IPv4 и IPv6. Например, 192.168.0.1. Занимает от 7 до 19 байт.

  • inet: интернет-адрес в формате cidr/y, где cidr это адрес в формате IPv4 или IPv6, а /y - количество бит в адресе (если этот параметр не указан, то используется 34 для IPv4, 128 для IPv6). Например, 192.168.0.1/24 или 2001:4f8:3:ba:2e0:81ff:fe22:d1f1/128. Занимает от 7 до 19 байт.

  • macaddr: хранит MAC-адрес. Занимает 6 байт.

  • macaddr8: хранит MAC-адрес в формате EUI-64. Занимает 8 байт.

Геометрические типы

  • point: представляет точку на плоскости в формате (x,y). Занимает 16 байт.

  • line: представляет линию неопределенной длины в формате {A,B,C}. Занимает 32 байта.

  • lseg: представляет отрезок в формате ((x1,y1),(x2,y2)). Занимает 32 байта.

  • box: представляет прямоугольник в формате ((x1,y1),(x2,y2)). Занимает 32 байта.

  • path: представляет набор содиненных точек. В формате ((x1,y1),...) путь является закрытым (первая и последняя точка соединяются линией) и фактически представляет многоугольник. В формате [(x1,y1),...] путь является открытым Занимает 16+16n байт.

  • polygon: представляет многоугольник в формате ((x1,y1),...). Занимает 40+16n байт.

  • circle: представляет окружность в формате <(x,y),r>. Занимает 24 байта.

Остальные типы данных

  • json: хранит данные json в текстовом виде.

  • jsonb: хранит данные json в бинарном формате.

  • uuid: хранит универсальный уникальный идентификатор (UUID), например, a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11. Занимает 32 байта.

  • xml: хранит даные в формате XML.

⚠️ **GitHub.com Fallback** ⚠️