SET BIND
Изменение привязки типа.Обеспечение совместимости со старыми клиентами.
SET BIND OF {<type-from> | TIME ZONE} TO { <type-to> | LEGACY | EXTENDED | NATIVE }
Параметр | Описание |
---|---|
type-from |
Тип данных для которого задаётся правило преобразования. |
type-to |
Тип данных в который следует преобразовать. |
Данный оператор позволяет задать правила описания типов возвращаемых клиенту нестандартным способом — тип type-from автоматически преобразуется к типу type-to.
Если используется неполное определение типа (например CHAR
вместо CHAR(n)
) в левой части SET BIND OF
приведения,то преобразование будет осуществляться для всех CHAR
столбцов, а не только для CHAR(1)
.
Специальный неполный тип TIME ZONE
обозначает все типы, а именно {TIME | TIMESTAMP} WITH TIME ZONE
.Когда неполное определение типа используется в правой части оператора (часть TO
),сервер автоматически определит недостающие детали этого типа на основе исходного столбца.
Изменение связывания любого NUMERIC
и DECIMAL
типа не влияет на соответствующий базовый целочисленный тип.Напротив, изменение привязки целочисленного типа данных также влияет на соответствующие NUMERIC
и DECIMAL
.
Ключевое слово LEGACY
в части TO
используется, когда тип данных, отсутствующий в предыдущей версии Firebird, должен быть представлен способом понятным для старого клиентского программного обеспечения (возможна некоторая потеря данных). Существуют следующие преобразования в LEGACY
типы:
Native тип | Legacy тип |
---|---|
BOOLEAN |
CHAR(5) |
DECFLOAT |
DOUBLE PRECISION |
INT128 |
BIGINT |
TIME WITH TIME ZONE |
TIME WITHOUT TIME ZONE |
TIMESTAMP WITH TIME ZONE |
TIMESTAMP WITHOUT TIME ZONE |
Использование EXTENDED
в части TO
заставляет Firebird использовать расширенную форму типа в части FROM.В настоящее время он работает только для {TIME | TIMESTAMP} WITH TIME ZONE
— они принудительно приводятсяк EXTENDED {TIME | TIMESTAMP} WITH TIME ZONE
.
Установка NATIVE
означает, что тип будет использоваться так, как если бы для него не было предыдущих правил преобразования.
Правила привязки типов можно установить на уровне соединения через API. Для этого в функцию соединения необходимо передать DPB со строковым значением тэга isc_dpb_set_bind
,в котором предоставлен список опций <type_from> TO <type_to>
, разделенных точкой с запятой.
Кроме того, преобразование типов в legacy типы доступные в предыдущих версиях Firebird можно установить с помощью параметра DataTypeCompatibility
в firebird.conf или databases.conf.Чем позже введено правило (.conf
→ DPB → SQL), тем выше его приоритет.
SET BIND OF
SELECT CAST('123.45' AS DECFLOAT(16)) FROM RDB$DATABASE; --native
CAST ======================= 123.45
SET BIND OF DECFLOAT TO DOUBLE PRECISION;
SELECT CAST('123.45' AS DECFLOAT(16)) FROM RDB$DATABASE; --double
CAST ======================= 123.4500000000000
SET BIND OF DECFLOAT(34) TO CHAR;
SELECT CAST('123.45' AS DECFLOAT(16)) FROM RDB$DATABASE; --всё ещё double
CAST ======================= 123.4500000000000
SELECT CAST('123.45' AS DECFLOAT(34)) FROM RDB$DATABASE; --text
CAST ========================================== 123.45
Если на стороне клиента отсутствует библиотека ICU, то результат следующего запроса будет таким:
SELECT CURRENT_TIMESTAMP FROM RDB$DATABASE;
CURRENT_TIMESTAMP ========================================================= 2020-02-21 16:26:48.0230 GMT*
Для того чтобы получить значение смещения времени относительно GMT, выполните следующее:
SET BIND OF TIME ZONE TO EXTENDED;
SELECT CURRENT_TIMESTAMP FROM RDB$DATABASE;
CURRENT_TIMESTAMP ========================================================= 2020-02-21 19:26:55.6820 +03:00