Spanner supporta un tipo di dati NUMERIC nei database GoogleSQL e PostgreSQL.
NUMERIC GoogleSQL
Il GoogleSQL NUMERIC è un
tipo di dati numerici esatti in grado di rappresentare un valore numerico esatto con una
precisione di 38 e una scalabilità di 9. Questa pagina fornisce una panoramica su come NUMERIC è rappresentato nelle librerie client.
NUMERIC PostgreSQL
Il tipo NUMERIC PostgreSQL è un tipo di dati numerici con precisione decimale arbitraria con una precisione massima (cifre totali) di 147.455 e una scalabilità massima (cifre a destra del punto decimale) di 16.383.
Spanner DDL non supporta la specifica di precisione e scalabilità per le colonne NUMERIC PostgreSQL. Tuttavia, i valori numerici possono essere convertiti in valori di precisione fissa nelle istruzioni DML. Ad esempio:
update t1 set numeric_column = (numeric_column*0.8)::numeric(5,2);
Il tipo DECIMAL è un alias per NUMERIC.
Le colonne NUMERIC PostgreSQL non possono essere utilizzate quando si specificano chiavi primarie, chiavi esterne o indici secondari.
Rappresentare NUMERIC in ogni linguaggio della libreria client
Per mantenere la fedeltà dei valori NUMERIC, ogni libreria
client Spanner archivia questi valori in un tipo di dati appropriato nel linguaggio della libreria
client. La tabella seguente elenca i tipi di dati a cui viene mappato NUMERIC in ogni linguaggio supportato.
| Lingua | GoogleSQL | PostgreSQL |
|---|---|---|
| C++ | spanner::Numeric | |
| C# | SpannerNumeric | |
| Vai | big.Rat | PGNumeric personalizzato |
| Java | BigDecimal | Tipo personalizzato. Consulta le note sulla libreria Java di PostgreSQL. |
| Node.js | Big | |
| PHP | Numerico personalizzato | |
| Python | Decimal | Decimale con annotazione personalizzata |
| Ruby | BigDecimal |
Tre librerie client, C++, C# e PHP, hanno implementato ciascuna un tipo personalizzato per rappresentare il tipo NUMERIC di Spanner SQL. Tutte le altre librerie utilizzano un tipo esistente.
L'oggetto spanner::Numeric della libreria client C++ non supporta le operazioni aritmetiche. Converti invece il numero contenuto nell'oggetto C++ di tua scelta.
Ad esempio, puoi estrarre il numero come stringa, che rappresenterebbe il numero con la massima fedeltà e senza perdita di dati. Se, tuttavia, sai in anticipo che il numero rientra, ad esempio, nell'intervallo di std:int64_t o double, puoi accedere al valore come quel tipo.
Note sulla libreria Java di PostgreSQL
La libreria client Java di Spanner utilizza un tipo Value.pgNumeric personalizzato per archiviare i valori NUMERIC PostgreSQL.
Scrivere in una colonna NUMERIC
Quando si scrive in una colonna NUMERIC in una tabella PostgreSQL, sono supportati più tipi.
Valori numerici
INSERT INTO Table (id, PgNumericColumn) VALUES (1, 1.23)Numeri interi
INSERT INTO Table (id, PgNumericColumn) VALUES (1, 1)Valori doppi
INSERT INTO Table (id, PgNumericColumn) VALUES (1, 1.23::float8)Valori letterali senza tipo
INSERT INTO Table (id, PgNumericColumn) VALUES (1, 'NaN')
Query con parametri
Quando utilizzi query con parametri, specifica i parametri con $<index>,
dove <index> indica la posizione del parametro. Il parametro deve essere associato utilizzando p<index>. Ad esempio, INSERT INTO MyTable (PgNumericColumn) VALUES ($1) con il parametro p1.
La libreria client Java supporta i seguenti tipi come valori con parametri:
Value.pgNumericpersonalizzatoStatement .newBuilder("INSERT INTO MyTable (PgNumericColumn) VALUES ($1), ($2)") .bind("p1") .to(Value.pgNumeric("1.23")) .bind("p2") .to(Value.pgNumeric("NaN")) .build()Valori doppi
Statement .newBuilder("INSERT INTO MyTable (PgNumericColumn) VALUES ($1), ($2)") .bind("p1") .to(1.23D) .bind("p2") .to(Double.NaN) .build()Numeri interi
Statement .newBuilder("INSERT INTO MyTable (PgNumericColumn) VALUES ($1)") .bind("p1") .to(1) .build()Valori lunghi
Statement .newBuilder("INSERT INTO MyTable (PgNumericColumn) VALUES ($1)") .bind("p1") .to(1L) .build()
Mutazioni
Quando utilizzi le mutazioni, i seguenti valori possono essere scritti nelle colonne di tipo numerico:
Stringhe
Mutation .newInsertBuilder("MyTable") .set("PgNumericColumn") .to("1.23") .build()Valori di tipi BigDecimal
BigDecimals
Mutation .newInsertBuilder("MyTable") .set("PgNumericColumn") .to(new BigDecimal("1.23")) .build()int
Mutation .newInsertBuilder("MyTable") .set("PgNumericColumn") .to(1) .build()Valori lunghi
Mutation .newInsertBuilder("MyTable") .set("PgNumericColumn") .to(1L) .build()Valori ottenuti come risultato di una chiamata a Value.pgNumeric
Mutation .newInsertBuilder("MyTable") .set("PgNumericColumn") .to(Value.pgNumeric("1.23")) .build()
Recuperare da una colonna NUMERIC
Per ottenere i valori archiviati nelle colonne numeriche di un ResultSet, utilizza ResultSet.getString() o ResultSet.getValue().
Stringhe
resultSet.getString("PgNumericColumn")Valore personalizzato
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
Aggiungere una colonna NUMERIC
L'esempio seguente mostra come aggiungere una colonna NUMERIC a una tabella denominata Venues utilizzando le librerie client Spanner.
C++
C#
Vai
Java
Node.js
PHP
Python
Ruby
Aggiornare i dati NUMERIC
L'esempio seguente mostra come aggiornare i dati NUMERIC utilizzando le librerie client Spanner.
C++
C#
Vai
Java
Node.js
PHP
Python
Ruby
Eseguire query sui dati NUMERIC
L'esempio seguente mostra come eseguire query sui dati NUMERIC utilizzando le librerie client Spanner.
C++
C#
Vai
Java
Node.js
PHP
Python
Ruby
NUMERIC è supportato nel driver JDBC Spanner utilizzando il tipo Java
BigDecimal. Per esempi di utilizzo di
NUMERIC consulta gli esempi di codice in
Connettere JDBC a un database con dialetto GoogleSQL.
Gestire NUMERIC durante la creazione di una libreria client o di un driver
Il tipo NUMERIC viene codificato come stringa in notazione decimale o scientifica
all'interno di un proto google.protobuf.Value. Questo proto viene racchiuso come a
ResultSet, PartialResultSet, o a Mutation a seconda che
venga letto o scritto. ResultSetMetadata utilizzerà il NUMERIC
TypeCode per indicare che il valore corrispondente deve essere letto come
NUMERIC.
Quando utilizzi NUMERIC in una libreria client o in un driver che crei, segui queste indicazioni.
Per leggere un
NUMERICda ResultSet:Leggi string_value dal google.protobuf.Value quando TypeCode è
NUMERICConverti la stringa nel tipo pertinente per la lingua specificata
Per scrivere un
NUMERICutilizzando le mutazioni, utilizza la rappresentazione della stringa come string_value nel google.protobuf.Value proto quando viene fornito il tipo pertinente.