Типы данных

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

Рассмотрим стандартные типы данных языка SQL.

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

В SQL существует достаточно большое количество числовых типов данных. В эту категорию типов данных входят числа с фиксированной точкой (целочисленные и дробные) и числа с плавающей точкой.

Целочисленные

Позволяют хранить целые числа по аналогии с типизированными языками программирования.

SMALLINT - 2 байта. Целые числа от –32 768 до +32 767

INTEGER - 4 байта. Целые числа от −231 до +231−1

BIGINT - 8 байт. Целые числа от −263 до +263−1

INT128 - 16 байт. Целые числа от -2127 до 2127−1

Числа с фиксированной точкой

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

DECIMAL(n, m) - 2, 4, 8 или 16 байт.

  • n (от 1 до 38) - общее количество знаков, которые могут быть сохранены, включая дробные.
  • m (от 0 до 38) - количество знаков после десятичной точки

Например, для числа 123.45 точность равна 5, а масштаб 2.

NUMERIC(n, m) - аналогичен DECIMAL.

Размер памяти, используемый для физического хранения значений такого типа,зависит от точности. Например, в РЕД База Данных:

ТочностьРазмер
1 - 42 байта
5 - 94 байта
10 - 188 байт
19 - 3816 байт

Числа с плавающей точкой

FLOAT - 4 байта. Числа от 1.175×10−38 до 3.402×1038

DOUBLE PRECISION - 8 байт. Числа от 2.225×10−308 до 1.179×10308

DECFLOAT является типом данных из стандарта SQL:2016, который точно хранит числа с плавающей запятой, в отличие от FLOAT или DOUBLE PRECISION, которые обеспечивают двоичное приближение предполагаемой точности. РЕД База Данных в соответствии со стандартом IEEE 754-2008 реализует типы DECIMAL64 и DECIMAL128, что обеспечивает точность DECFLOAT 16 и 34 значащих цифр, и занимает 8 и 16 байт памяти соответственно.

Если точность не указана, то по умолчанию используется точность 34 значащих цифры.

Все промежуточные вычисления осуществляются с использованием 34-значными значениями.

Операции для числовых типов данных

Для числовых типов данных определены четыре арифметические операции – сложение, вычитание, умножение и деление.

Операции сложения и вычитания для всех числовых типов данных выполняются обычным образом.

При выполнении операций умножения и деления чисел с фиксированной точкой (SMALLINT, INTEGER, BIGINT, DECIMAL и NUMERIC) результат будет иметь количество дробных знаков, равное сумме дробных знаков обоих операндов.

Например, результатом деления 1/3 будет 0, потому что сумма дробных знаков операндов равна нулю, а целая часть в результате выполнения операции деления будет равна нулю. Результат является целочисленным. Чтобы получить значение с заданной точностью, необходимо у одного или у обоих операндов явно указать нужное количество нулевых дробных знаков.

Например, операция 1.00 / 3 вернет уже более верное число – 0.33. Тот же результат можно получить, если записать операцию деления в следующем виде: 1.0 / 3.0

Для чисел с плавающей точкой все операции выполняются таким же образом, как принято во всех языках программирования.

Строковые типы данных

К строковым (символьным) типам данных относятся следующие типы данных, определенные в SQL:

CHAR(n), CHARACTER(n) – символьный тип данных фиксированной длины. Число n задает максимальное количество символов. Конечные пробелы в базе данных не хранятся, а восстанавливаются до указанного размера при отображении такого столбца. Максимальный размер столбца 32767 байтов. Если количество символов n не указано, принимается 1.

VARCHAR(n), VARYING CHARACTER (n) – символьный тип данных переменной длины. Максимальный размер 32765 байтов. Если количество символов n не указано, то предполагается 1024.

NCHAR(n), NATIONAL CHARACTER (n), NCHAR VARYING (n), NATIONAL CHARACTER VARYING (n) – символьные типы данных длины. Отличается от типов данных CHARACTER и VARYING CHARACTER только тем, что для них предопределен набор символов ISO8859_1 (кодировка, предназначенная для западноевропейских языков). Другие наборы символов для этих типов данных задавать нельзя, поэтому в России они применяются редко.

BINARY(n) является типом данных с фиксированной длиной для хранения двоичных данных. Если переданное количество байт меньше объявленной длины n, то значение будет дополнено нулями. В случае если не указана длина, то считается, что она равна единице.

Этот тип является псевдонимом типа

CHAR [(<длина>)] CHARACTER SET OCTETS

VARBINARY (n), BINARY VARYING (n) – является типом для хранения двоичных данных переменной длины n. Реальный размер хранимой структуры равен фактическому размеру данных плюс 2 байта, в которых задана длина поля.

Этот тип является псевдонимом типа

VARCHAR (<длина>) CHARACTER SET OCTETS

Строковые константы заключаются в апострофы. Если в строковой константе присутствует символ апостроф, то он должен быть представлен двумя подряд идущими апострофами.

Для строковых типов данных определена только одна операция конкатенации – соединения двух строк в одну. Для обозначения этой операции применяются два подряд идущих символа вертикальной черты ||.

Результатом этой операции является строка, которая представляет собой соединение двух операндов. Операция всегда возвращает тип данных CHAR (а не VARCHAR), независимо от того, какой именно строковый тип данных имеют исходные строки. Это означает, что в результате конкатенации сохраняются конечные пробелы. Размер (количество символов) результирующей строки равен сумме размеров исходных строк конкатенации. Например, можно записать следующую операцию:

’Руководство ’ || ’по SQL ’

Результатом будет одна строка: «Руководство по SQL».

Для строковых и ряда других типов данных применимо множество встроенных функций SQL.

Логический тип данных

РЕД База Данных предоставляет стандартный SQL тип BOOLEAN, у которого может быть 3 значения:

  • TRUE (истина)
  • FALSE (ложь)
  • UNKNOWN (неизвестно) представляется SQL значением NULL.

Спецификация не делает различия между значением NULL этого типа и значением истинности UNKNOWN, которое является результатом SQL предиката, поискового условия или выражения логического типа. Эти значения взаимозаменяемы и обозначают одно и то же.

Значения типа BOOLEAN могут быть проверены в неявных значениях истинности. Например, field1 OR field2 или NOT field1 являются допустимыми выражениями.

Предикаты могут использовать оператор IS [NOT] для проверки соответствия. Например, field1 IS FALSE или field1 IS NOT TRUE.

Тип данных BOOLEAN не преобразуется неявно ни к одному типу, но возможно явное преобразование к строке с помощью функции CAST.

Покажем значения выражений на примере.

ВыражениеЗначение
1 <> 4TRUE
1 == 4FALSE
FALSEFALSE
NULL - 1NULL
NULL == 1NULL
NULL == NULLNULL

Тип данных даты и времени

Существует три типа данных для представления даты и времени – DATE, TIME и TIMESTAMP, позволяющие хранить, соответственно, дату, время и объединение даты и времени.

Тип данных DATE

Этот тип данных позволяет хранить только дату в диапазоне от 1 января 1 года до 31 декабря 9999 года.

Для литералов, представляющих дату, в SQL существует много форматов. При описании синтаксиса для формата типа DATE для указания номера дня в месяце используются символы «dd» (число от 1 до 31), для месяца в году — «mm» (число от 1 до 12), для номера года — «yyyy» (число от 1 до 9999). Для номера дня и номера месяца ведущий ноль можно не указывать. Год может быть задан и числом с меньшей, чем четыре, значимостью. Вот основные форматы даты, используемые в РЕД Базе Данных:

dd.mm.yyyy 
mm-dd-yyyy 
mm/dd/yyyy 
yyyy-mm-dd 
yyyy/mm/dd 
yyyy.mm.dd 
dd-MON-yyyy

MON – трехсимвольное сокращенное название месяца (английское). Может принимать значения (в любом регистре): jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec – месяцы с января по декабрь.

Например, дату 14 июля 2025 года можно записать в следующем виде: '14.07.2025', '14-JUL-2025', '07-12-2025', '07/12/2025' и т.д.

Тип данных TIME

Позволяет хранить время дня в диапазоне от 00:00:00.0000 до 23:59:59.9999. По умолчанию тип TIME не содержит информацию о часовом поясе. Для того чтобы тип TIME включал информацию о часовом поясе необходимо использовать его с модификатором WITH TIME ZONE.

   TIME [{WITH | WITHOUT} TIME ZONE]

При преобразовании из/в TIME WITH TIME ZONE учитывайте, что тип TIME WITHOUT TIME ZONE определен для использования в часовом поясе сеанса.

Часовой пояс сеанса как следует из названия может быть разным для каждого соединения с базой данных. Если не установлен, то часовой пояс сеанса будет тем же, что используется операционной системой, в которой запущен процесс СУБД.

Часовой пояс сеанса может быть изменён с помощью оператора

SET TIME ZONE

или сброшен в исходное значение с помощью

SET TIME ZONE LOCAL

Часовой пояс может быть задан строкой с регионом часового пояса (например, America/ Sao_Paulo), или в виде смещения часов:минут относительно GMT (например, -03:00). Список региональных часовых поясов и их идентификаторов можно найти в документации к СУБД РЕД База Данных.

TIME WITH TIME ZONE хранится так же как TIME WITHOUT TIME ZONE плюс 2 байта для идентификации часового пояса или смещения. TIME часть хранится в UTC (и переводится в сохранённый часовой пояс).

Тип данных TIMESTAMP

Тип данных дата и время (TIMESTAMP) представляет собой соединение даты и времени, которые в литералах просто разделяются любым количеством пробелов.

Например, для задания 12 часов 30 минут 14 июня 2025 года можно записать: '14.07.2025 12:30'

Для того чтобы тип TIMESTAMP включал информацию о часовом поясе необходимо использовать его с модификатором WITH TIME ZONE.

   TIMESTAMP [{WITH | WITHOUT} TIME ZONE]

В РЕД База Данных можно получить текущие дату и время с помощью встроенных функций:

NOW - текущая дата и время в момент обращения к функции.

CURRENT_TIMESTAMP типа TIMESTAMP WITH TIME ZONE – метка времени старта запроса с временной зоной. Не меняется в процессе выполнения запроса.

LOCALTIMESTAMP типа TIMESTAMP WITHOUT TIME ZONE – метка времени старта запроса без временной зоны. Не меняется в процессе выполнения запроса.

CURRENT_DATE типа DATE – текущая дата.

Арифметические операции для типов данных даты и времени

Для типов данных даты (DATE) и времени (TIME) определены операции сложения и вычитания.

Операция сложения для типа DATE и целого числа дает дату, увеличенную на заданное количество дней. Вычитание из типа данных DATE целого числа возвращает дату, уменьшенную на указанное количество дней. В операции можно указать и дробное число. К ошибке это не приводит, происходит правильное округление числа до ближайшего целого.

Например, следующая операция дает завтрашнюю дату: CURRENT_DATE + 1 Чтобы получить вчерашнюю дату, нужно записать: CURRENT_DATE - 1

Вычитание двух дат дает количество дней в интервале. Например, чтобы узнать, сколько дней осталось до Нового Года 2030, нужно записать: CAST('31.12.2029' AS DATE) - CURRENT_DATE

Сложение «TIME + число» дает указанное время, увеличенное на заданное число секунд, включая десятитысячные доли секунды. Здесь в операции можно использовать дробное число.

Соответственно, вычитание «TIME − число» дает время, уменьшенное на заданное число секунд, включая десятитысячные доли секунды.

Вычитание двух переменных типа TIME дает интервал времени в секундах (включая десятитысячные доли секунды).

Для типа данных TIMESTAMP ни одна из перечисленных операций недопустима.

Тип данных BLOB

Тип данных BLOB называется большим двоичным объектом (Binary Large OBject). Этот тип данных позволяет хранить любые большие по объему данные – форматированные тексты, графику, звуки, видео.

Синтаксис объявления типа BLOB

    BLOB [SUB_TYPE <имя подтипа>]
        [SEGMENT SIZE <размер сегмента>] 
        [CHARACTER SET <набор символов>]

Поля BLOB не хранятся непосредственно в самой записи вместе с другими данными строки. Запись содержит только ссылку (идентификатор, указатель) на страницу базы данных, где располагаются данные BLOB. Тип данных BLOB характеризуется размером сегмента, в котором размещаются данные. Размер сегмента задает в байтах размер полей в базе данных, которые будут использованы для хранения данных типа BLOB. По умолчанию принимается 80.

Максимальный размер сегмента не может превышать 64Кб – 1, то есть числа 65535. За одно обращение к базе данных система всегда считывает один сегмент. Если в поле BLOB хранятся данные, занимающие менее 32765 байтов, то хранение и работа с этим полем осуществляется так же, как и с полем, имеющим тип данных VARCHAR.

Объем данных, которые могут храниться в этом типе данных, зависит от размера страницы базы данных:

Размер страницыМакс. размер BLOB
4K4ГБ
8K32ГБ
16K256ГБ
32K2TB

При объявлении столбца или домена типа BLOB можно указать его подтип (предложение SUB_TYPE), а также размер сегмента, используемый при хранении данных (предложение SEGMENT SIZE). Значение подтипа может быть целым числом в диапазоне от –32768 до +32767.

Широко используемыми подтипами являются:

  • 0 (BINARY) - неструктурированные двоичные данные.
  • 1 (TEXT) - текстовые данные. К полями такого типа может применяться большинство строковых функций.

Кроме этих двух в РЕД База Данных существует еще семь (от 2 до 8 включительно) заранее предопределенных подтипов. Их не следует использовать для каких-то своих внутренних целей.

Подтипы могут использоваться в случае, когда в базе данных описаны стандартные BLOB-фильтры. Фильтры – это программы, которые выполняют преобразования между данными BLOB разных подтипов на серверной и клиентской стороне. Такие преобразования связаны, как правило, с упаковкой и, соответственно, распаковкой данных.

Контрольные вопросы

  1. Дайте определение типа данных?
  2. Назовите основные целочисленные типы данных?
  3. В чем отличие чисел с фиксированной точкой от чисел с плавающей точкой?
  4. Какие типы данных могут применяться для хранения чисел с плавающей точкой?
  5. В чем особенность операций умножения и деления для чисел с фиксированной точкой?
  6. В чем отличие символьных типов данных с фиксированной и переменной длиной?
  7. Какие операции определены для символьных типов данных?
  8. Какие значения могут быть у логического типа данных?
  9. В каком диапазоне может хранить даты переменная типа DATE?
  10. Как сравнить два значения времени в разных часовых поясах?
  11. Что получится если сложить две переменные типа DATE?
  12. Что получится если из одной переменной типа TIME вычесть значение другой?
  13. Для чего предназначен типа данных BLOB?
  14. Какие подтипы BLOB известны?