FirebirdSQL logo
 Cryptage des bases de donnéesAutres articles 

Le comportement des types de données

SET BIND

Destination

Modifier la liaison de type. Assurer la compatibilité avec les anciens clients.

Syntaxe
SET BIND
  OF {<type-from> | TIME ZONE}
  TO { <type-to> | LEGACY | EXTENDED | NATIVE }
Table 1. Paramètres de l’opérateur `SET BIND OF'.
Paramètre Description

type-from

Le type de données pour lequel la règle de conversion est spécifiée.

type-to

Le type de données à convertir.

Cet opérateur vous permet de définir des règles pour décrire les types retournés au client d’une manière non standard — le type type-from est automatiquement converti en type type-to.

Si une définition de type incomplète est utilisée (par exemple, CHAR au lieu de CHAR(n)) sur le côté gauche de l’induction SET BIND OF,alors la conversion sera faite pour toutes les colonnes CHAR, et pas seulement CHAR(1).

Le type spécial incomplet TIME ZONE dénote tous les types, à savoir {TIME | TIMESTAMP} WITH TIME ZONE.Lorsqu’une définition de type incomplète est utilisée dans la partie droite de la déclaration (la partie TO),le serveur définira automatiquement les détails manquants de ce type sur la base de la colonne d’origine.

La modification de la liaison d’un type NUMERIC et DECIMAL n’affecte pas le type entier sous-jacent correspondant.Inversement, la modification de la liaison d’un type de données entier affecte également les NUMERIC et DECIMAL correspondants.

Le mot-clé LEGACY dans la partie TO est utilisé lorsqu’un type de données non présent dans une version précédente de Firebird doit être représenté d’une manière compréhensible pour un logiciel client plus ancien (une certaine perte de données peut se produire). Il existe les conversions suivantes pour les types LEGACY :

Table 2. Conversions vers les anciens types
Type natif Type d’héritage

BOOLEAN

CHAR(5)

DECFLOAT

DOUBLE PRECISION

INT128

BIGINT

TIME WITH TIME ZONE

TIME WITHOUT TIME ZONE

TIMESTAMP WITH TIME ZONE

TIMESTAMP WITHOUT TIME ZONE

L’utilisation de EXTENDED dans la partie TO force Firebird à utiliser le formulaire de type étendu dans la partie FROM.Actuellement, cela ne fonctionne que pour {TIME | TIMESTAMP} WITH TIME ZONE — ils sont appliquésen EXTENDED {TIME | TIMESTAMP} WITH TIME ZONE.

Mettre NATIVE signifie que le type sera utilisé comme s’il n’y avait pas de règles de conversion précédentes pour lui.

La même fonctionnalité peut être obtenue en utilisant le tag isc_dpb_set_bind dans DPB.En outre, la conversion de type vers les anciens types disponibles dans les versions précédentes de Firebird peut être définie à l’aide du paramètre DataTypeCompatibility dans firebird.conf ou databases.conf.Plus la règle est entrée tard (.conf → DPB → SQL), plus sa priorité est élevée.

Example 1. Utilisation de 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;	--toujours double
                   CAST
=======================
      123.4500000000000
SELECT CAST('123.45' AS DECFLOAT(34)) FROM RDB$DATABASE;	--text
CAST
==========================================
123.45
Example 2. Utilisation de SET BIND OF TIME ZONE TO EXTENDED

S’il n’y a pas de bibliothèque ICU du côté client, le résultat de la prochaine requête sera erroné

SELECT CURRENT_TIMESTAMP FROM RDB$DATABASE;
                                        CURRENT_TIMESTAMP
=========================================================
2020-02-21 16:26:48.0230 GMT*

Afin d’obtenir la valeur du décalage horaire par rapport à l’heure GMT, procédez comme suit

SET BIND OF TIME ZONE TO EXTENDED;
SELECT CURRENT_TIMESTAMP FROM RDB$DATABASE;
                                        CURRENT_TIMESTAMP
=========================================================
2020-02-21 19:26:55.6820 +03:00