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

SET DECFLOAT

Destination

Modifier le mode d’arrondi et le comportement d’erreur pour le type DECFLOAT.

SET DECFLOAT
  { ROUND <round_mode>
  | TRAPS TO [<trap_opt> [, <trap_opt> ...]] }

<round_mode> ::=
    CEILING | UP | HALF_UP | HALF_EVEN
  | HALF_DOWN | DOWN | FLOOR | REROUND

<trap_opt> ::=
    DIVISON_BY_ZERO | INEXACT | INVALID_OPERATION
  | OVERFLOW | UNDERFLOW

SET DECFLOAT ROUND

L’opérateur SET DECFLOAT ROUND change le mode d’arrondi pour la session en cours.Les modes d’arrondi suivants, compatibles IEEE, sont pris en charge :

CEILLING

Arrondissement à partir du haut. Si tous les chiffres rejetés sont des zéros ou si le signe du nombre est négatif, le dernier chiffre non rejeté reste le même. Dans le cas contraire, le dernier chiffre non rejeté est incrémenté de un (arrondi à l’unité supérieure).

UP

Arrondissement à partir de zéro (troncature avec incrément). Les valeurs rejetées sont ignorées.

HALF_UP

Arrondi à la valeur la plus proche. Cette option est utilisée par défaut. Si le résultat est équidistant, l’arrondi au chiffre supérieur est effectué. Si les valeurs écartées sont supérieures ou égales à la moitié (0,5) de un à la position gauche suivante, le dernier chiffre non écarté est incrémenté de un (arrondi vers le haut). Sinon, les valeurs rejetées sont ignorées.

HALF_EVEN

Arrondi à la valeur la plus proche. Si le résultat est équidistant, l’arrondi est effectué de manière à ce que le dernier chiffre soit pair. Si les valeurs rejetées sont supérieures à la moitié (0,5) d’une unité dans la position suivante à gauche, le dernier chiffre non rejeté est incrémenté d’une unité (arrondi à l’unité supérieure). S’ils sont inférieurs à la moitié, le résultat n’est pas corrigé, c’est-à-dire que les chiffres rejetés sont ignorés. Dans le cas contraire, lorsque les valeurs rejetées sont exactement égales à la moitié, le dernier chiffre non rejeté est inchangé s’il est pair et incrémenté d’une unité (arrondi au chiffre supérieur) dans le cas contraire (pour obtenir un chiffre pair). Ce mode d’arrondi est également appelé arrondi de banque et donne une impression d’arrondi équitable.

HALF_DOWN

Arrondir à la valeur la plus proche. Si le résultat est équidistant, l’arrondi au chiffre inférieur est effectué. Si les valeurs écartées sont supérieures ou égales à la moitié (0,5) de un dans la position gauche suivante, le dernier chiffre non écarté est décrémenté de un (arrondi vers le bas). Sinon, les valeurs rejetées sont ignorées.

DOWN

Arrondi vers zéro (troncature). Les valeurs rejetées sont ignorées.

FLOOR

Arrondi vers le bas. Si tous les chiffres écartés sont des zéros ou si le signe est positif, le dernier chiffre non écarté ne change pas. Dans le cas contraire (signe négatif), le dernier chiffre non rejeté est incrémenté de un.

REROUND

Arrondi à une valeur supérieure si l’arrondi est de 0 ou 5, sinon l’arrondi est à une valeur inférieure.

Example 1. Changement du mode d’arrondi
SET DECFLOAT ROUND HALF_DOWN;
Modes d’arrondi 12.341 12.345 12.349 12.355 12.405 -12.345

CEILING

12.35

12.35

12.35

12.36

12.41

-12.34

UP

12.35

12.35

12.35

12.36

12.41

-12.35

HALF_UP

12.34

12.35

12.35

12.36

12.41

-12.35

HALF_EVEN

12.34

12.34

12.35

12.36

12.40

-12.34

HALF_DOWN

12.34

12.34

12.35

12.35

12.40

-12.34

DOWN

12.34

12.34

12.34

12.35

12.40

-12.34

FLOOR

12.34

12.34

12.34

12.35

12.40

-12.35

REROUND

12.34

12.34

12.34

12.36

12.41

-12.34