Spanner supporta un tipo di dati NUMERIC
nei database GoogleSQL e PostgreSQL.
NUMERIC di GoogleSQL
NUMERIC
di GoogleSQL è un tipo di dati numerici esatto in grado di rappresentare un valore numerico esatto con una precisione di 38 e una scala di 9. Questa pagina fornisce una panoramica di come NUMERIC
è rappresentato nelle librerie client.
NUMERIC di PostgreSQL
Il tipo NUMERIC
di PostgreSQL è un tipo di dati numerico con precisione decimale arbitraria con una precisione massima (cifre totali) di 147.455 e una scala massima (cifre a destra del separatore decimale) di 16.383.
Spanner DDL non supporta la specifica di precisione e scala per le colonne NUMERIC
di PostgreSQL. Tuttavia, i valori numerici possono essere convertiti in
valori a precisione fissa nelle istruzioni DML. Ad esempio:
update t1 set numeric_column = (numeric_column*0.8)::numeric(5,2);
Il tipo DECIMAL
è un alias di NUMERIC
.
Le colonne NUMERIC
di PostgreSQL non possono essere utilizzate quando vengono specificate 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 memorizza questi valori in un tipo di dati appropriato nel linguaggio della libreria
client. La tabella seguente elenca i tipi di dati a cui NUMERIC
viene
mappato in ogni lingua supportata.
Lingua | GoogleSQL | PostgreSQL |
---|---|---|
C++ | spanner::Numeric | |
C# | SpannerNumeric | |
Vai | big.Rat | Custom PGNumeric |
Java | BigDecimal | Tipo personalizzato. Consulta le note sulla libreria Java di PostgreSQL. |
Node.js | Big | |
PHP | personalizzato numerico | |
Python | Decimale | 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++ che preferisci.
Ad esempio, puoi estrarre il numero come stringa, che rappresenterà 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 tipo.
Note sulla libreria Java PostgreSQL
La libreria client Java di Spanner utilizza un tipo Value.pgNumeric
personalizzato
per archiviare i valori NUMERIC di PostgreSQL.
Scrivere in una colonna NUMERIC
Sono supportati più tipi durante la scrittura in una colonna NUMERIC in una tabella PostgreSQL.
Valori numerici
INSERT INTO Table (id, PgNumericColumn) VALUES (1, 1.23)
Numeri interi
INSERT INTO Table (id, PgNumericColumn) VALUES (1, 1)
Doppio
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 quindi
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 parametrizzati:
Personalizzato
Value.pgNumeric
Statement .newBuilder("INSERT INTO MyTable (PgNumericColumn) VALUES ($1), ($2)") .bind("p1") .to(Value.pgNumeric("1.23")) .bind("p2") .to(Value.pgNumeric("NaN")) .build()
Doppio
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()
Lunghi
Statement .newBuilder("INSERT INTO MyTable (PgNumericColumn) VALUES ($1)") .bind("p1") .to(1L) .build()
Mutazioni
Quando utilizzi le modifiche, i seguenti valori possono essere scritti nelle colonne di tipo numerico:
Stringhe
Mutation .newInsertBuilder("MyTable") .set("PgNumericColumn") .to("1.23") .build()
Valori dei tipi BigDecimal
BigDecimals
Mutation .newInsertBuilder("MyTable") .set("PgNumericColumn") .to(new BigDecimal("1.23")) .build()
Ints
Mutation .newInsertBuilder("MyTable") .set("PgNumericColumn") .to(1) .build()
Lunghi
Mutation .newInsertBuilder("MyTable") .set("PgNumericColumn") .to(1L) .build()
Valori ottenuti a seguito 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 memorizzati 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
Il seguente esempio mostra come aggiungere una colonna NUMERIC
a una tabella denominata
Venues
utilizzando le librerie client Spanner.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Aggiornare i dati NUMERIC
Il seguente esempio mostra come aggiornare i dati NUMERIC
utilizzando le librerie client Spanner.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Eseguire query sui dati NUMERIC
Il seguente esempio mostra come eseguire query sui dati di NUMERIC
utilizzando le librerie client Spanner.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
NUMERIC
è supportato nel driver JDBC di 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.
Gestisci NUMERIC quando crei una libreria client o un driver
Il tipo NUMERIC
è codificato come stringa in notazione decimale o scientifica
all'interno di un proto google.protobuf.Value. Questo proto viene incluso come ResultSet, PartialResultSet o Mutation a seconda che venga letto o scritto. ResultSetMetadata utilizzerà 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, rispetta le seguenti indicazioni.
Per leggere un
NUMERIC
da ResultSet:Leggi string_value dal proto google.protobuf.Value quando TypeCode è
NUMERIC
Converti la stringa nel tipo pertinente per la lingua specificata
Per scrivere un
NUMERIC
utilizzando le mutazioni, utilizza la rappresentazione di stringa come string_value nel proto google.protobuf.Value quando viene fornito il tipo pertinente.