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 OFSELECT 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