Spanner accepte un type de données NUMERIC
dans les bases de données GoogleSQL et PostgreSQL.
NUMERIC GoogleSQL
Le type de données GoogleSQL NUMERIC
est un type de données numérique exact capable de représenter une valeur numérique exacte avec une précision de 38 et une échelle de 9. Cette page présente la manière dont le type NUMERIC
est représenté dans les bibliothèques clientes.
PostgreSQL NUMERIC
Le type PostgreSQL NUMERIC
est un type de données numérique de précision décimale avec une précision maximale (nombre total de chiffres) de 147 455 et une échelle maximale (chiffres à droite de la virgule) de 16 383.
Le LDD Spanner ne permet pas de spécifier la précision et l'échelle pour
Colonnes NUMERIC
PostgreSQL. Cependant, les valeurs numériques peuvent être converties en valeurs de précision fixe dans les instructions LMD. Exemple :
update t1 set numeric_column = (numeric_column*0.8)::numeric(5,2);
Le type DECIMAL
est un alias pour NUMERIC
.
Les colonnes PostgreSQL NUMERIC
ne peuvent pas être utilisées lors de la spécification de clés primaires, de clés étrangères ou d'index secondaires.
Représenter NUMERIC dans chaque langage de la bibliothèque cliente
Pour maintenir la fidélité des valeurs NUMERIC
, chaque client Spanner
bibliothèque stocke ces valeurs dans un type de données approprié dans le client
langage de bibliothèque. Le tableau suivant répertorie les types de données auxquels le type NUMERIC
est mappé dans chaque langage compatible.
Langue | GoogleSQL | PostgreSQL |
---|---|---|
C++ | spanner::Numeric | |
C# | SpannerNumeric | |
Go | big.Rat | PGNumeric personnalisé |
Java | BigDecimal | Type personnalisé. Consultez les remarques sur la bibliothèque Java pour PostgreSQL. |
Node.js | Grande | |
PHP | Type Numeric personnalisé | |
Python | Décimal | Décimal avec annotation personnalisée |
Ruby | BigDecimal |
Trois bibliothèques clientes, C++, C# et PHP, ont chacune mis en œuvre un type personnalisé pour représenter le type NUMERIC
de Spanner SQL. Toutes les autres bibliothèques utilisent un type existant.
L'objet spanner::Numeric
de la bibliothèque cliente C++ n'est pas compatible avec les opérations arithmétiques. Convertissez plutôt le nombre contenu en objet C++ de votre choix.
Par exemple, vous pouvez extraire le nombre sous la forme d'une chaîne, représentant le nombre de manière ultraprécise et sans perte de données. Toutefois, si vous savez à l'avance que ce nombre convient, dans la plage std:int64_t
ou double
par exemple, vous pouvez accéder à la valeur de ce type.
Remarques concernant la bibliothèque Java pour PostgreSQL
La bibliothèque cliente Java Spanner utilise un type Value.pgNumeric
personnalisé
pour stocker les valeurs NUMERIC PostgreSQL.
Écrire dans une colonne NUMERIC
Plusieurs types sont acceptés lors de l'écriture dans une colonne NUMERIC d'une table PostgreSQL.
Types numériques
INSERT INTO Table (id, PgNumericColumn) VALUES (1, 1.23)
Entiers
INSERT INTO Table (id, PgNumericColumn) VALUES (1, 1)
Doubles
INSERT INTO Table (id, PgNumericColumn) VALUES (1, 1.23::float8)
Littéraux non typés
INSERT INTO Table (id, PgNumericColumn) VALUES (1, 'NaN')
Requêtes paramétrées
Lorsque vous utilisez des requêtes paramétrées, spécifiez les paramètres à l'aide de $<index>
, où <index>
désigne la position du paramètre. Le paramètre doit ensuite être lié à l'aide de p<index>
. Par exemple, INSERT INTO MyTable (PgNumericColumn) VALUES ($1)
avec le paramètre p1
.
La bibliothèque cliente Java accepte les types suivants en tant que valeurs paramétrées :
Value.pgNumeric
personnaliséStatement .newBuilder("INSERT INTO MyTable (PgNumericColumn) VALUES ($1), ($2)") .bind("p1") .to(Value.pgNumeric("1.23")) .bind("p2") .to(Value.pgNumeric("NaN")) .build()
Doubles
Statement .newBuilder("INSERT INTO MyTable (PgNumericColumn) VALUES ($1), ($2)") .bind("p1") .to(1.23D) .bind("p2") .to(Double.NaN) .build()
Entiers
Statement .newBuilder("INSERT INTO MyTable (PgNumericColumn) VALUES ($1)") .bind("p1") .to(1) .build()
Longs
Statement .newBuilder("INSERT INTO MyTable (PgNumericColumn) VALUES ($1)") .bind("p1") .to(1L) .build()
Mutations
Lorsque vous utilisez des mutations, les valeurs suivantes sont autorisées à être écrites dans des colonnes de type numérique :
Chaînes
Mutation .newInsertBuilder("MyTable") .set("PgNumericColumn") .to("1.23") .build()
Valeurs de types Bigdecimal
BigDecimals
Mutation .newInsertBuilder("MyTable") .set("PgNumericColumn") .to(new BigDecimal("1.23")) .build()
Ints
Mutation .newInsertBuilder("MyTable") .set("PgNumericColumn") .to(1) .build()
Longs
Mutation .newInsertBuilder("MyTable") .set("PgNumericColumn") .to(1L) .build()
Valeurs obtenues suite à un appel à Value.pgNumeric
Mutation .newInsertBuilder("MyTable") .set("PgNumericColumn") .to(Value.pgNumeric("1.23")) .build()
Récupérer une valeur depuis une colonne NUMERIC
Pour obtenir des valeurs stockées dans des colonnes numériques d'un ResultSet, utilisez ResultSet.getString()
ou ResultSet.getValue()
.
Chaînes
resultSet.getString("PgNumericColumn")
Valeur personnalisée
Value pgNumeric = resultSet.getValue("PgNumericColumn"); pgNumeric.getString(); // get underlying value as a String pgNumeric.getNumeric(); // get underlying value as a BigDecimal pgNumeric.getFloat64(); // get underlying value as aDouble
Ajouter une colonne NUMERIC
L'exemple suivant montre comment ajouter une colonne NUMERIC
à une table appelée
Venues
à l'aide des bibliothèques clientes Spanner.
C++
C#
Go
Java
Node.js
<ph type="x-smartling-placeholder">
PHP
<ph type="x-smartling-placeholder">
Python
Ruby
Mettre à jour les données NUMERIC
L'exemple suivant montre comment mettre à jour des données NUMERIC
à l'aide des bibliothèques clientes Spanner.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Interroger des données NUMERIC
L'exemple suivant montre comment interroger des données NUMERIC
à l'aide des bibliothèques clientes Spanner.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
NUMERIC
est compatible avec le pilote JDBC Spanner avec Java
BigDecimal. Pour obtenir des exemples d'utilisation de NUMERIC
, consultez les exemples de code dans la section Connecter JDBC à une base de données GoogleSQL.
Gérer NUMERIC lors de la création d'une bibliothèque cliente ou d'un pilote
Le type NUMERIC
est encodé sous la forme d'une chaîne au format décimal ou scientifique au sein d'un fichier proto google.protobuf.Value. Ce fichier proto est encapsulé en tant que ResultSet, PartialResultSet ou Mutation selon qu'il est lu ou écrit. ResultSetMetadata utilise le code de type NUMERIC pour indiquer que la valeur correspondante doit être lue en tant que NUMERIC
.
Lorsque vous utilisez un type NUMERIC dans une bibliothèque cliente ou un pilote que vous créez, respectez les instructions suivantes.
Pour lire un type
NUMERIC
à partir de ResultSet :Lisez la chaîne string_value du fichier proto google.protobuf.Value lorsque le code est de type
NUMERIC
.Convertissez cette chaîne en type approprié pour le langage donné.
Pour écrire un objet
NUMERIC
à l'aide de Mutations, utilisez la représentation de chaîne en tant que "string_value" dans le fichier proto google.protobuf.Value lorsque le type approprié est indiqué.