Cloud Spanner unterstützt den Datentyp NUMERIC
sowohl in Google Standard SQL- als auch in PostgreSQL-Datenbanken.
Google-Standard-SQL NUMERIC
Google Standard-SQL NUMERIC
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-NUMERIC
-Spalten 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-NUMERIC
-Spalten 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 Cloud Spanner-Clientbibliothek diese Werte in einem geeigneten Datentyp in der Sprache der Clientbibliothek. In der folgenden Tabelle sind die Datentypen aufgeführt, denen NUMERIC
in jeder unterstützten Sprache zugeordnet ist.
Sprache | Google-Standard-SQL | 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 Cloud 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 Cloud Spanner-Java-Clientbibliothek verwendet zum Speichern von PostgreSQL-NUMERIC-Werten einen benutzerdefinierten Value.pgNumeric
-Typ.
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 derzeit die folgenden Typen als parametrisierte Werte:
Benutzerdefiniert
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()
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 Cloud Spanner-Clientbibliotheken eine Spalte NUMERIC
hinzufügen.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
NUMERIC-Daten werden aktualisiert
Das folgende Beispiel zeigt, wie NUMERIC
-Daten mit den Cloud Spanner-Clientbibliotheken abgefragt werden.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
NUMERIC-Daten abfragen
Das folgende Beispiel zeigt, wie NUMERIC
-Daten mit den Cloud Spanner-Clientbibliotheken abgefragt werden.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
NUMERIC
wird im JDBC-Treiber mit dem Java-Typ BigDecimal unterstützt. Beispiele zur Verwendung von NUMERIC
finden Sie in den Codebeispielen unter Open-Source-JDBC-Treiber verwenden.
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
NUMERIC
aus dem ResultSet:Lesen Sie den string_value aus der Proto-Datei google.protobuf.Value, wenn TypeCode
NUMERIC
ist.Konvertieren Sie diesen String in den relevanten Typ für die angegebene Sprache.
Zum Schreiben eines
NUMERIC
mit Mutationen verwenden Sie die Stringdarstellung als string_value in der Proto-Datei google.protobuf.Value, wenn der entsprechende Typ angegeben ist.