Spanner supporta un tipo di dati NUMERIC
nei database GoogleSQL e PostgreSQL.
NUMERIC GoogleSQL
GoogleSQL NUMERIC
è un tipo di dati numerici esatti in grado di rappresentare un valore numerico esatto con precisione pari a 38 e scala pari a 9. Questa pagina fornisce una panoramica di come NUMERIC
viene rappresentato nelle librerie client.
PostgreSQL NUMERIC
Il tipo di PostgreSQL NUMERIC
è un tipo di dati numerico a precisione decimale arbitraria con una precisione massima (cifre totali) di 147.455 e una scala massima (cifre a destra del punto decimale) di 16.383.
Il DDL di Spanner non supporta la specifica di precisione e scalabilità per le colonne NUMERIC
di PostgreSQL. Tuttavia, i valori numerici possono essere trasmessi a
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 NUMERIC
di PostgreSQL non possono essere utilizzate per specificare chiavi primarie, chiavi esterne o indici secondari.
Rappresenta NUMERIC in ogni lingua della libreria client
Per mantenere la fedeltà dei valori NUMERIC
, ogni libreria client di Spanner archivia questi valori in un tipo di dati appropriato nel linguaggio della libreria client. La seguente tabella elenca i tipi di dati a cui NUMERIC
è mappato in ogni lingua supportata.
Lingua | GoogleSQL | PostgreSQL |
---|---|---|
C++ | spanner::Numerico | |
C# | SpannerNumeric | |
Go | big.Rat | PGNumerico personalizzato |
Java | BigDecimal | Tipo personalizzato. Consulta le note sulla libreria Java di PostgreSQL. |
Node.js | Grande | |
PHP | Numerico personalizzato | |
Python | Decimale | Decimale con annotazione personalizzata |
Ruby | BigDecimal |
Ognuna di tre librerie client, C++, C# e PHP, ha implementato 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 operazioni aritmetiche. Converti invece il numero contenuto nell'oggetto C++ che preferisci.
Ad esempio, puoi estrarre il numero come stringa, che rappresenterebbe il numero alla massima fedeltà e senza perdite di dati. Tuttavia, se sai in anticipo che questo numero rientra, ad esempio, nell'intervallo 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 valori NUMERIC di PostgreSQL.
Scrivi in una colonna NUMERIC
Sono supportati più tipi quando si scrive in una colonna NUMERIC di 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 non digitati
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:
Value.pgNumeric
personalizzatoStatement .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 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 in seguito a 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, 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
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#
Go
Java
Node.js
PHP
Python
Ruby
Aggiorna dati NUMERIC
L'esempio seguente mostra come aggiornare i dati di NUMERIC
utilizzando le librerie client di Spanner.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Esegui query sui dati NUMERIC
L'esempio seguente mostra come eseguire query sui dati di NUMERIC
utilizzando le librerie client di Spanner.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
NUMERIC
è supportato nel driver JDBC di Spanner che utilizza il tipo BigDecimal Java. Per esempi di come viene utilizzato NUMERIC
, consulta gli esempi di codice in Connessione di JDBC a un database di dialetto GoogleSQL.
Gestisci NUMERIC durante la creazione di una libreria client o di un driver
Il tipo NUMERIC
è codificato come stringa con notazione decimale o scientifica all'interno di un protocollo google.protobuf.Value. Questo protocollo viene aggregato come ResultSet, PartialResultSet o come mutazione, a seconda che il protocollo sia letto o scritto. ResultSetMetadata utilizzerà 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 che hai creato, osserva le seguenti indicazioni.
Per leggere un elemento
NUMERIC
dal ResultSet:Leggi il valore string_value dal protocollo google.protobuf.Value quando TypeCode è
NUMERIC
Converti quella stringa nel tipo pertinente per la lingua specificata
Per scrivere un elemento
NUMERIC
utilizzando le mutazioni, utilizza la rappresentazione stringa come string_value nel proto google.protobuf.Value quando viene fornito il tipo pertinente.