Cloud Spanner unterstützt den Datentyp NUMERIC sowohl in GoogleSQL- als auch in PostgreSQL-Datenbanken.
GoogleSQL NUMERIC
`NUMERIC` in GoogleSQLNUMERIC ist ein
genauer numerischer Datentyp, der einen genauen numerischen Wert mit einer
Genauigkeit von 38 und einer Skalierung von 9 darstellen kann. Auf dieser Seite erhalten Sie eine Übersicht über die Darstellung von NUMERIC in Clientbibliotheken.
PostgreSQL – NUMERIC
Der PostgreSQL-Typ NUMERIC ist ein numerischer Datentyp mit beliebiger Dezimalgenauigkeit mit einer maximalen Genauigkeit (Gesamtzahl der Ziffern) von 147.455 und einer maximalen Skalierung (Ziffern rechts vom Dezimalzeichen) von 16.383.
Spanner-DDL unterstützt die Angabe von Genauigkeit und Skalierung für PostgreSQL--Spalten NUMERIC nicht. Numerische Werte können jedoch in DML-Anweisungen in Werte mit fester Genauigkeit umgewandelt werden. Beispiel:
update t1 set numeric_column = (numeric_column*0.8)::numeric(5,2);
Der Typ DECIMAL ist ein Alias für NUMERIC.
PostgreSQL--Spalten NUMERIC können nicht bei der Angabe von Primärschlüsseln, Fremdschlüsseln oder sekundären Indexen verwendet werden.
Darstellung von NUMERIC in der Sprache der Clientbibliothek
Um die Genauigkeit der NUMERIC-Werte zu gewährleisten, speichert jede Spanner-Client
bibliothek diese Werte in einem geeigneten Datentyp in der Sprache der Client
bibliothek. In der folgenden Tabelle sind die Datentypen aufgeführt, denen NUMERIC in jeder unterstützten Sprache zugeordnet ist.
| Sprache | GoogleSQL | PostgreSQL |
|---|---|---|
| C++ | spanner::Numeric | |
| C# | SpannerNumeric | |
| Go | big.Rat | Benutzerdefiniertes PGNumeric |
| Java | BigDecimal | Benutzerdefinierter Typ Siehe PostgreSQL-Java-Bibliothekshinweise. |
| Node.js | Groß | |
| PHP | benutzerdefiniertes Numeric | |
| Python | Decimal | Dezimalzahl mit benutzerdefinierter Annotation |
| Ruby | BigDecimal |
Drei Clientbibliotheken, C++, C# und PHP haben jeweils einen benutzerdefinierten Typ, um den Typ NUMERIC von Spanner SQL darzustellen. Alle anderen Bibliotheken verwenden einen vorhandenen Typ.
Das spanner::Numeric-Objekt der C++-Clientbibliothek unterstützt keine arithmetischen Operationen. Wandeln Sie die enthaltene Zahl stattdessen in das C++-Objekt Ihrer Wahl um.
Beispielsweise können Sie die Zahl als String extrahieren, der die vollständige Genauigkeit und ohne Datenverlust darstellt. Wenn Sie jedoch im Voraus wissen, dass diese Zahl z. B. in den Bereich von std:int64_t oder double passt, können Sie auf den Wert als diesen Typ zugreifen.
PostgreSQL-Java-Bibliothekshinweise
Die Spanner-Java-Clientbibliothek verwendet zum Speichern von PostgreSQL-NUMERIC-Werten einen benutzerdefinierten Typ Value.pgNumeric.
In eine NUMERIC-Spalte schreiben
Beim Schreiben in eine NUMERIC-Spalte in einer PostgreSQL-Tabelle werden mehrere Typen unterstützt.
Numerische Ausdrücke
INSERT INTO Table (id, PgNumericColumn) VALUES (1, 1.23)Ganzzahlen
INSERT INTO Table (id, PgNumericColumn) VALUES (1, 1)Doppel
INSERT INTO Table (id, PgNumericColumn) VALUES (1, 1.23::float8)Literale ohne Typ
INSERT INTO Table (id, PgNumericColumn) VALUES (1, 'NaN')
Parametrisierte Abfragen
Wenn Sie parametrisierte Abfragen verwenden, geben Sie die Parameter mit $<index> an, wobei <index> die Parameterposition angibt. Der Parameter sollte dann mithilfe von p<index> gebunden werden. Beispiel: INSERT INTO MyTable (PgNumericColumn) VALUES ($1) mit dem Parameter p1.
Die Java-Clientbibliothek unterstützt die folgenden Typen als parametrisierte Werte:
Benutzerdefiniertes
Value.pgNumericStatement .newBuilder("INSERT INTO MyTable (PgNumericColumn) VALUES ($1), ($2)") .bind("p1") .to(Value.pgNumeric("1.23")) .bind("p2") .to(Value.pgNumeric("NaN")) .build()Doppel
Statement .newBuilder("INSERT INTO MyTable (PgNumericColumn) VALUES ($1), ($2)") .bind("p1") .to(1.23D) .bind("p2") .to(Double.NaN) .build()Ganzzahlen
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()
Mutationen
Bei Verwendung von Mutationen dürfen die folgenden Werte in Spalten des numerischen Typs geschrieben werden:
Strings
Mutation .newInsertBuilder("MyTable") .set("PgNumericColumn") .to("1.23") .build()Werte von BigDecimal-Typen
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()Werte, die als Ergebnis eines Aufrufs von Value.pgNumeric abgerufen wurden
Mutation .newInsertBuilder("MyTable") .set("PgNumericColumn") .to(Value.pgNumeric("1.23")) .build()
Aus einer NUMERIC-Spalte abrufen
Verwenden Sie ResultSet.getString() oder ResultSet.getValue(), um Werte zu erhalten, die in numerischen Spalten eines ResultSet gespeichert sind.
Strings
resultSet.getString("PgNumericColumn")Benutzerdefinierter Wert
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
NUMERIC-Spalte hinzufügen
Im folgenden Beispiel wird gezeigt, wie Sie der Tabelle Venues mit den Spanner-Clientbibliotheken eine Spalte NUMERIC hinzufügen.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
NUMERIC-Daten aktualisieren
Im folgenden Beispiel wird gezeigt, wie Sie NUMERIC-Daten mit den Spanner-Clientbibliotheken aktualisieren.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
NUMERIC-Daten abfragen
Im folgenden Beispiel wird gezeigt, wie Sie NUMERIC-Daten mit den Spanner-Clientbibliotheken abfragen.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
NUMERIC wird im Spanner-JDBC-Treiber mit dem Java
BigDecimal-Typ unterstützt. Beispiele zur Verwendung von
NUMERIC finden Sie in den Codebeispielen unter
JDBC-Verbindung zu einer Datenbank im GoogleSQL-Dialekt herstellen.
Umgang mit NUMERIC beim Erstellen einer Clientbibliothek oder eines Treibers
Der Typ NUMERIC wird als String in Dezimal- oder wissenschaftlicher Schreibweise
in einer google.protobuf.Value-Proto-Datei codiert. Diese Proto-Datei wird entweder als ResultSet, PartialResultSet oder als Mutation verpackt, je nachdem, ob sie gelesen oder geschrieben wird. ResultSetMetadata verwendet den NUMERIC TypeCode, um anzugeben, dass der entsprechende Wert als NUMERIC gelesen werden soll.
Beachten Sie die folgenden Hinweise, wenn Sie mit NUMERIC in einer von Ihnen erstellten Clientbibliothek oder einem Treiber arbeiten.
So lesen Sie ein
NUMERICaus dem ResultSet:Lesen Sie den string_value aus der Proto-Datei google.protobuf.Value, wenn TypeCode
NUMERICist.Konvertieren Sie diesen String in den relevanten Typ für die angegebene Sprache.
Zum Schreiben eines
NUMERICmit Mutationen verwenden Sie die Stringdarstellung als string_value in der Proto-Datei google.protobuf.Value, wenn der entsprechende Typ angegeben ist.