Tous les produits
Search
Centre de documentation

MaxCompute:DECIMAL data type

Dernière mise à jour :Aug 10, 2026

Cette rubrique présente les concepts, les considérations, les cas d'utilisation et des exemples liés au type de données DECIMAL de MaxCompute.

Vue d'ensemble

Le type DECIMAL est conçu pour les calculs décimaux en haute précision. Il est couramment utilisé dans les domaines financiers et scientifiques qui exigent une rigueur absolue sur la précision. Dans MaxCompute, le comportement du type DECIMAL varie selon l'édition du type de données configurée pour le projet :

  • Type de données DECIMAL 2.0 désactivé

    Le type DECIMAL utilise un format à précision fixe, par défaut DECIMAL(54,18). La précision (nombre maximal de chiffres) et l'échelle (nombre de décimales) ne peuvent pas être spécifiées. Plage de la partie entière : -1036+1 à 1036-1. Partie décimale : précise jusqu'à 10-18. Pour utiliser ce type de données, définissez l'indicateur suivant :

    SET odps.sql.decimal.odps2=false;
  • Type de données DECIMAL 2.0 activé

    La valeur par défaut est DECIMAL(38,18). Vous pouvez spécifier la précision (nombre maximal de chiffres) et l'échelle (nombre de décimales). Selon vos exigences de précision, deux catégories sont disponibles :

    • DECIMAL standard : la plage de précision est [1,38] et celle de l'échelle est [0, précision]. Pour utiliser ce type de données, définissez les indicateurs suivants :

      SET odps.sql.type.system.odps2=true;
      SET odps.sql.decimal.odps2=true;

      Limites de l'échelle :

      • Si odps.sql.decimal2.extended.scale.enable=false (valeur par défaut) :

        La plage d'échelle prise en charge est [0, 18]. Tous les résultats de calcul sont tronqués à 18 décimales.

      • Si odps.sql.decimal2.extended.scale.enable=true :

        Les calculs en haute précision sont pris en charge avec une plage d'échelle de [0, 38].

    • DECIMAL256 : la plage de précision est [39,76] et celle de l'échelle est [0, précision]. Pour utiliser ce type de données, définissez les indicateurs suivants :

      SET odps.sql.type.system.odps2=true;
      SET odps.sql.decimal.odps2=true;
      SET odps.sql.decimal256.enable=true;

      Limitations d'utilisation :

      • Si odps.sql.decimal256.auto.promotion=true; est défini pour activer la promotion automatique des types, le système promeut automatiquement les résultats de calcul vers le type DECIMAL256 de plus haute précision selon les besoins, permettant ainsi des calculs en haute précision sur une plage plus étendue. Pour un exemple détaillé, consultez Exemple 5.

      • Lorsque odps.sql.decimal256.enable=true est activé, les indicateurs odps.sql.type.system.odps2 et odps.sql.decimal.odps2 doivent également être définis sur true. Sinon, les requêtes renvoient une erreur.

      • Prend en charge les fonctions arithmétiques de base, les fonctions d'agrégation et les expressions courantes (y compris SUM, AVG, MEDIAN, MAX et MIN). Le type DECIMAL256 ne peut pas être utilisé comme clé primaire (PK) ni comme clé de cluster.

Considérations

  • Une même table ne peut pas contenir simultanément l'ancien et le nouveau type de données DECIMAL.

  • Lorsque le type de données DECIMAL 2.0 est activé, si le mode compatible Hive est activé (SET odps.sql.hive.compatible=true;) ou si le mode compatible BigQuery est activé (SET odps.sql.bigquery.compatible=true;), les valeurs DECIMAL(precision, scale) sont arrondies lors de l'importation des données (Tunnel Upload) et des calculs SQL si le nombre de décimales dépasse l'échelle définie. Si la partie entière dépasse la limite, aucune erreur n'est renvoyée, mais les données d'entrée deviennent NULL.

  • Lorsque odps.sql.decimal.tostring.trimzero est défini sur true, les zéros non significatifs après la virgule sont supprimés. Lorsqu'il est défini sur false, ils sont conservés. Cette règle s'applique uniquement aux valeurs lues depuis les tables, pas aux valeurs statiques. Valeur par défaut : true.

Cas d'utilisation

Type de données

Configuration

Description

Ancien DECIMAL

SET odps.sql.decimal.odps2=false;

Le type de données DECIMAL 2.0 est désactivé. La précision et l'échelle ne peuvent pas être spécifiées. Valeur par défaut : DECIMAL(54,18).

DECIMAL standard

SET odps.sql.decimal.odps2=true;
SET odps.sql.decimal2.extended.scale.enable=false;



Type DECIMAL standard avec une précision allant jusqu'à 38. Lors du calcul, l'échelle est limitée à 18.

SET odps.sql.decimal.odps2=true;
SET odps.sql.decimal2.extended.scale.enable=true;



Type DECIMAL standard avec une précision allant jusqu'à 38. Prend en charge les calculs en haute précision avec une plage d'échelle de [0, 38].

DECIMAL256

SET odps.sql.type.system.odps2=true;

SET odps.sql.decimal.odps2=true;

SET odps.sql.decimal256.enable=true;

SET odps.sql.decimal2.extended.scale.enable=false;

SET odps.sql.decimal256.auto.promotion=false;

Active DECIMAL256, mais conserve le comportement d'origine lorsque la précision des valeurs DECIMAL impliquées dans les calculs est inférieure ou égale à 38. Convient pour la migration depuis DECIMAL standard (plage d'échelle [0,18]) vers DECIMAL256 sans modifier le comportement des jobs existants.

SET odps.sql.type.system.odps2=true;
SET odps.sql.decimal.odps2=true;
SET odps.sql.decimal256.enable=true;
SET odps.sql.decimal2.extended.scale.enable=true;
SET odps.sql.decimal256.auto.promotion=false;
























Active DECIMAL256, mais conserve le comportement d'origine lorsque la précision des valeurs DECIMAL impliquées dans les calculs est inférieure ou égale à 38. Convient pour la migration depuis DECIMAL standard (plage d'échelle [0, 38]) vers DECIMAL256 sans modifier le comportement des jobs existants.

SET odps.sql.type.system.odps2=true;
SET odps.sql.decimal.odps2=true;
SET odps.sql.decimal256.enable=true;
SET odps.sql.decimal2.extended.scale.enable=true;
SET odps.sql.decimal256.auto.promotion=true;
























Active DECIMAL256 avec toutes ses fonctionnalités. Convient aux nouveaux projets ne nécessitant pas de rétrocompatibilité.

Exemples

Type de données DECIMAL 2.0 désactivé

Exemple 1 : Le type DECIMAL utilise par défaut DECIMAL(54,18) et ne peut pas être ajusté.

-- Disable the DECIMAL 2.0 data type.
SET odps.sql.decimal.odps2=false;

-- Column a is of the DECIMAL type with fixed precision/scale (54,18). Adjustment is not supported.
CREATE OR REPLACE TABLE foo_t(a DECIMAL);

-- The following CREATE statement returns an error because specifying precision/scale is not supported in this mode.
CREATE OR REPLACE TABLE foo_t(a DECIMAL(5,2));
-- Error: FAILED: ODPS-0130071:[1,33] Semantic analysis exception - precision and scale is not currently supported in current mode, 'SET odps.sql.decimal.odps2=true' to enable

Type de données DECIMAL 2.0 activé

  • Exemple 1 : Le type DECIMAL permet de spécifier la précision et l'échelle.

    -- Enable the DECIMAL 2.0 data type.
    SET odps.sql.decimal.odps2=true;
    
    CREATE OR REPLACE TABLE foo_t(a DECIMAL(4,2));
  • Exemple 2 : Lorsque la précision et l'échelle ne sont pas spécifiées pour le type DECIMAL, la valeur par défaut dépend de l'activation ou non du mode compatible Hive. Si le mode compatible Hive est désactivé, la valeur par défaut est DECIMAL(38,18). S'il est activé, la valeur par défaut est DECIMAL(10,0).

    -- Enable the DECIMAL 2.0 data type with Hive-compatible mode disabled.
    SET odps.sql.decimal.odps2=true;
    SET odps.sql.hive.compatible=false;
    
    CREATE OR REPLACE TABLE foo_t(a DECIMAL);
    
    -- The data type of column a is DECIMAL(38,18).
    DESC foo_t;
    -- Result:
    +------------------------------------------------------------------------------------+
    | Owner:                    ALIYUN$odps_pd_testcloud_com                             |
    | Project:                  xxxx                                             |
    | TableComment:                                                                      |
    +------------------------------------------------------------------------------------+
    | CreateTime:               2026-04-21 13:36:21                                      |
    | LastDDLTime:              2026-04-21 13:36:21                                      |
    | LastModifiedTime:         2026-04-21 13:36:21                                      |
    +------------------------------------------------------------------------------------+
    | InternalTable: YES      | Size: 0                                                  |
    +------------------------------------------------------------------------------------+
    | Native Columns:                                                                    |
    +------------------------------------------------------------------------------------+
    | Field           | Type       | Label | Comment                                     |
    +------------------------------------------------------------------------------------+
    | a               | decimal(38,18) |       |                                             |
    +------------------------------------------------------------------------------------+
    
    -- Enable the DECIMAL 2.0 data type with Hive-compatible mode enabled.
    SET odps.sql.decimal.odps2=true;
    SET odps.sql.hive.compatible=true;
    
    CREATE OR REPLACE TABLE foo_t(a DECIMAL);
    
    -- The data type of column a is DECIMAL(10,0).
    DESC foo_t;
    -- Result:
    +------------------------------------------------------------------------------------+
    | Owner:                    ALIYUN$odps_pd_testcloud_com                             |
    | Project:                  ***_project                                             |
    | TableComment:                                                                      |
    +------------------------------------------------------------------------------------+
    | CreateTime:               2026-04-21 13:38:04                                      |
    | LastDDLTime:              2026-04-21 13:38:04                                      |
    | LastModifiedTime:         2026-04-21 13:38:04                                      |
    +------------------------------------------------------------------------------------+
    | InternalTable: YES      | Size: 0                                                  |
    +------------------------------------------------------------------------------------+
    | Native Columns:                                                                    |
    +------------------------------------------------------------------------------------+
    | Field           | Type       | Label | Comment                                     |
    +------------------------------------------------------------------------------------+
    | a               | decimal(10,0) |       |                                             |
    +------------------------------------------------------------------------------------+
  • Exemple 3 : Pour le type DECIMAL standard, la plage de précision est [1,38] et celle de l'échelle est [0, précision]. Pour activer les calculs en haute précision avec une plage d'échelle de [0,38], définissez SET odps.sql.decimal2.extended.scale.enable=true;.

    SET odps.sql.type.system.odps2=true;
    SET odps.sql.decimal.odps2=true;  -- Enable the DECIMAL 2.0 data type.
    SET odps.sql.decimal2.extended.scale.enable=true; -- Enable high-precision computation with a scale range of [0,38].
    
    -- Multiply two DECIMAL values. The result data type is decimal(22,19).
    EXPLAIN SELECT CAST(1bd AS DECIMAL(10,9))*CAST(1bd AS DECIMAL(11,10));
    -- Result:
    job0 is root job
    
    In Job job0:
    root Tasks: M1
    
    In Task M1:
        VALUES: _c0 : {1}
            Statistics: Num rows: 1.0, Data size: 16.0
            FS: output: Screen
                schema:
                  _c0 (decimal(22,19))
    
                Statistics: Num rows: 1.0, Data size: 16.0
    
    -- Set the flag to false. The output type scale is truncated to 18, resulting in decimal(22,18).
    SET odps.sql.decimal2.extended.scale.enable=false; -- Disable extended scale. Scale range: [0,18].
    EXPLAIN SELECT CAST(1bd AS DECIMAL(10,9))*CAST(1bd AS DECIMAL(11,10));
    -- Result:
    job0 is root job
    
    In Job job0:
    root Tasks: M1
    
    In Task M1:
        VALUES: _c0 : {1}
            Statistics: Num rows: 1.0, Data size: 16.0
            FS: output: Screen
                schema:
                  _c0 (decimal(22,18))
    
                Statistics: Num rows: 1.0, Data size: 16.0
  • Exemple 4 : Pour le type DECIMAL256, la plage de précision est [39,76] et celle de l'échelle est [0, précision].

    SET odps.sql.type.system.odps2=true;
    SET odps.sql.decimal.odps2=true;
    SET odps.sql.decimal256.enable=true;
    
    CREATE OR REPLACE TABLE foo_t(a decimal(60,10));
    
    EXPLAIN SELECT * FROM foo_t;
    -- Result:
    job0 is root job
    
    In Job job0:
    root Tasks: M1
    
    In Task M1:
        Data source: ***_project.foo_t
        TS: muze_project.foo_t
            Statistics: Num rows: 1.0, Data size: 16.0
            FS: output: Screen
                schema:
                  a (decimal(60,10))
    
                Statistics: Num rows: 1.0, Data size: 16.0
    
  • Exemple 5 : Par défaut, la multiplication de deux valeurs DECIMAL standard produit un résultat de type DECIMAL standard. Si le résultat dépasse la plage autorisée, il est tronqué.

    SET odps.sql.type.system.odps2=true;
    SET odps.sql.decimal.odps2=true;
    
    -- The result type is decimal(38,5) because it is truncated to fit the standard DECIMAL range.
    EXPLAIN SELECT CAST(1bd AS DECIMAL(30,5)) * CAST(1bd AS DECIMAL(30,0));
    -- Result:
    job0 is root job
    
    In Job job0:
    root Tasks: M1
    
    In Task M1:
        VALUES: _c0 : {1}
            Statistics: Num rows: 1.0, Data size: 16.0
            FS: output: Screen
                schema:
                  _c0 (decimal(38,5))
    
                Statistics: Num rows: 1.0, Data size: 16.0
    

    Lorsque DECIMAL256 est activé et que SET odps.sql.decimal256.auto.promotion=true; est défini pour activer la promotion automatique des types, le système promeut automatiquement les résultats de calcul vers des types DECIMAL256 de plus haute précision, évitant ainsi toute troncature et préservant la précision intégrale.

    SET odps.sql.type.system.odps2=true;
    SET odps.sql.decimal.odps2=true;
    SET odps.sql.decimal256.enable=true;
    SET odps.sql.decimal256.auto.promotion=true;
    
    -- The result type is decimal(61,5). The product of two standard DECIMAL values is promoted to the DECIMAL256 range.
    EXPLAIN SELECT CAST(1bd AS DECIMAL(30,5)) * CAST(1bd AS DECIMAL(30,0));
    -- Result:
    job0 is root job
    
    In Job job0:
    root Tasks: M1
    
    In Task M1:
        VALUES: _c0 : {1}
            Statistics: Num rows: 1.0, Data size: 16.0
            FS: output: Screen
                schema:
                  _c0 (decimal(61,5))
    
                Statistics: Num rows: 1.0, Data size: 16.0