Spanner supporta un tipo di dati NUMERIC
sia in GoogleSQL che
PostgreSQL.
NUMERICO GoogleSQL
GoogleSQL NUMERIC
è un
tipo di dati numerici esatti in grado di rappresentare un valore numerico esatto con
precisione di 38 e scala di 9. Questa pagina fornisce una panoramica di come NUMERIC
è rappresentato nelle librerie client.
PostgreSQL NUMERIC
Il tipo PostgreSQL NUMERIC
è una precisione decimale arbitraria
tipo di dati con una precisione massima (cifre totali) di 147.455 e una scala massima
(cifre a destra della virgola decimale) di 16.383.
Il DDL di Spanner non supporta la specifica di precisione e scalabilità per
PostgreSQL NUMERIC
colonne. Tuttavia, i valori numerici possono essere
valori di precisione fissi 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 PostgreSQL NUMERIC
non possono essere utilizzate quando specifichi chiavi primarie,
chiavi esterne o indici secondari.
Rappresenta NUMERIC in ogni lingua della libreria client
Per mantenere la fedeltà dei valori NUMERIC
, ogni client Spanner
archivia questi valori in un tipo di dati appropriato nel client
lingua della biblioteca. La tabella seguente elenca i tipi di dati a cui NUMERIC
viene
mappate in ogni lingua supportata.
Lingua | GoogleSQL | PostgreSQL |
---|---|---|
C++ | spanner::Numeric | |
C# | SpannerNumeric | |
Vai | big.Rat | PGNumerico personalizzato |
Java | BigDecimal | Tipo personalizzato. Consulta le note sulla libreria Java di PostgreSQL. |
Node.js | Grande | |
PHP | personalizzato Numerico | |
Python | Decimale | Decimale con annotazione personalizzata |
Ruby | BigDecimal |
Tre librerie client, C++, C# e PHP, hanno ciascuna implementata un tipo personalizzato
rappresenta il tipo NUMERIC
di Spanner SQL. Tutte le altre librerie utilizzano
tipo esistente.
L'oggetto spanner::Numeric
della libreria client C++ non supporta operazioni aritmetiche
operazioni. Converti invece il numero contenuto nell'oggetto C++ di tua scelta.
Ad esempio, puoi estrarre il numero come stringa, che rappresenterebbe il
senza alcuna perdita di dati. Se, tuttavia, sai in anticipo
il numero rientra, ad esempio, nell'intervallo di std:int64_t
o double
,
puoi accedere al valore di quel tipo.
Note sulla libreria Java PostgreSQL
La libreria client Java di Spanner utilizza un tipo Value.pgNumeric
personalizzato
per archiviare i valori NUMERIC PostgreSQL.
Scrivi in una colonna NUMERIC
Sono supportati più tipi durante la scrittura in una colonna NUMERIC in un e PostgreSQL dalla 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 non digitati
INSERT INTO Table (id, PgNumericColumn) VALUES (1, 'NaN')
Query con parametri
Quando utilizzi le 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 che è
p1
.
La libreria client Java supporta i seguenti tipi valori con parametri:
Value.pgNumeric
personalizzataStatement .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 si utilizzano le mutazioni, è possibile scrivere i seguenti valori 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()
Int
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()
Recupera da una colonna NUMERIC
Per ottenere i valori archiviati nelle colonne numeriche di un ResultSet,
usa 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
Aggiungi una colonna NUMERIC
L'esempio seguente mostra come aggiungere una colonna NUMERIC
a una tabella denominata
Venues
utilizzando le librerie client di Spanner.
C++
C#
Vai
Java
Node.js
PHP
Python
Ruby
Aggiorna dati NUMERIC
L'esempio seguente mostra come aggiornare i dati NUMERIC
utilizzando le librerie client di Spanner.
C++
C#
Vai
Java
Node.js
PHP
Python
Ruby
Esegui query su dati NUMERIC
L'esempio seguente mostra come eseguire query sui dati NUMERIC
utilizzando le librerie client di Spanner.
C++
C#
Vai
Java
Node.js
PHP
Python
Ruby
NUMERIC
è supportato nel driver JDBC di Spanner utilizzando il comando Java
BigDecimal. Per esempi su come
È in uso NUMERIC
; guarda gli esempi di codice in
Collega JDBC a un database di dialetti GoogleSQL.
Gestisci NUMERIC durante la creazione di una libreria client o di un driver
Il tipo NUMERIC
è codificato come stringa in notazione decimale o scientifica
all'interno di un protocollo google.protobuf.Value. Questo protocollo è aggregato
ResultSet, PartialResultSet o un Mutation in base al fatto che
quando viene letto o scritto. ResultSetMetadata utilizzerà il parametro NUMERIC
TypeCode per indicare che il valore corrispondente deve essere letto come
NUMERIC
.
Quando lavori con NUMERIC in una libreria client o in un driver creato da te, osserva le seguenti indicazioni.
Per leggere un
NUMERIC
dal set di risultati:Leggi il valore string_value dal protocollo google.protobuf.Value quando Il valore TypeCode è
NUMERIC
Converti quella stringa nel tipo pertinente per la lingua specificata
Per scrivere un
NUMERIC
utilizzando le mutazioni, usa la rappresentazione stringa come string_value nel protocollo google.protobuf.Value quando vengono forniti i valori pertinenti di testo.