Spanner admite un tipo de datos NUMERIC
en las bases de datos de Google SQL y PostgreSQL.
NUMERIC de GoogleSQL
El tipo de datos NUMERIC
de GoogleSQL es un tipo de datos numéricos exacto capaz de representar un valor numérico exacto con una precisión de 38 y una escala de 9. En esta página, se proporciona una descripción general de cómo se representa NUMERIC
en las bibliotecas cliente.
NUMERIC de PostgreSQL
El tipo NUMERIC
de PostgreSQL es un tipo de datos numérico con precisión decimal arbitraria que tiene una precisión máxima (dígitos totales) de 147,455 y una escala máxima (dígitos a la derecha del punto decimal) de 16,383.
El DDL de Spanner no admite la especificación de precisión y escala para las columnas NUMERIC
de PostgreSQL. Sin embargo, los valores numéricos pueden convertirse en
valores de precisión fijos en declaraciones DML. Por ejemplo:
update t1 set numeric_column = (numeric_column*0.8)::numeric(5,2);
El tipo DECIMAL
es un alias para NUMERIC
.
Las columnas NUMERIC
de PostgreSQL no se pueden usar cuando se especifican claves primarias.
externas o índices secundarios.
Representa valores NUMERIC en cada lenguaje de biblioteca cliente
Para mantener la fidelidad de los valores NUMERIC
, cada biblioteca cliente de Spanner almacena esos valores en un tipo de datos adecuado en el lenguaje de la biblioteca cliente. En la siguiente tabla, se enumeran los tipos de datos a los que NUMERIC
se asigna en cada lenguaje admitido.
Idioma | GoogleSQL | PostgreSQL |
---|---|---|
C++ | spanner::Numeric | |
C# | SpannerNumeric | |
Comienza a usarlo | big.Rat | PGNumeric personalizado |
Java | BigDecimal | Tipo personalizado. Consulta Notas de la biblioteca de Java para PostgreSQL. |
Node.js | Grande | |
PHP | Numeric personalizado | |
Python | Decimal | Decimal con anotación personalizada |
Ruby | BigDecimal |
Cada una de las tres bibliotecas cliente, C++, C# y PHP, tienen implementado un tipo personalizado para representar el tipo NUMERIC
de SQL de Spanner. Todas las demás bibliotecas usan un tipo existente.
El objeto spanner::Numeric
de la biblioteca cliente C++ no admite operaciones aritméticas. En cambio, convierte el número que contiene en el objeto C++ que elijas.
Por ejemplo, puedes extraer el número como una string, lo que representaría el número con fidelidad completa y sin pérdida de datos. Sin embargo, si ya sabes que ese número se ajusta, por ejemplo, dentro del rango de std:int64_t
o double
, puedes acceder al valor como ese tipo.
Notas de la biblioteca de Java para PostgreSQL
La biblioteca cliente de Java para Spanner usa un tipo Value.pgNumeric
personalizado
para almacenar valores NUMERIC de PostgreSQL.
Cómo escribir en una columna NUMERIC
Se admiten varios tipos cuando se escribe en una columna NUMERIC de una tabla de PostgreSQL.
Caracteres numéricos
INSERT INTO Table (id, PgNumericColumn) VALUES (1, 1.23)
enteros
INSERT INTO Table (id, PgNumericColumn) VALUES (1, 1)
Dobles
INSERT INTO Table (id, PgNumericColumn) VALUES (1, 1.23::float8)
Literales sin tipo
INSERT INTO Table (id, PgNumericColumn) VALUES (1, 'NaN')
Consultas con parámetros
Cuando uses consultas con parámetros, especifícalos con $<index>
,
donde <index>
indica la posición del parámetro. El parámetro debería ser
vinculada con p<index>
. Por ejemplo:
INSERT INTO MyTable (PgNumericColumn) VALUES ($1)
, con el parámetro
p1
La biblioteca cliente de Java admite los siguientes tipos como valores parametrizados:
Value.pgNumeric
personalizadaStatement .newBuilder("INSERT INTO MyTable (PgNumericColumn) VALUES ($1), ($2)") .bind("p1") .to(Value.pgNumeric("1.23")) .bind("p2") .to(Value.pgNumeric("NaN")) .build()
Dobles
Statement .newBuilder("INSERT INTO MyTable (PgNumericColumn) VALUES ($1), ($2)") .bind("p1") .to(1.23D) .bind("p2") .to(Double.NaN) .build()
enteros
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()
Mutaciones
Cuando se usan mutaciones, se permite escribir los siguientes valores en columnas de tipo numérico:
Strings
Mutation .newInsertBuilder("MyTable") .set("PgNumericColumn") .to("1.23") .build()
Valores de tipos de BigDecimal
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()
Valores obtenidos como resultado de una llamada a Value.pgNumeric
Mutation .newInsertBuilder("MyTable") .set("PgNumericColumn") .to(Value.pgNumeric("1.23")) .build()
Recupera de una columna NUMERIC
Para obtener valores almacenados en columnas numéricas de un ResultSet, usa ResultSet.getString()
o ResultSet.getValue()
.
Strings
resultSet.getString("PgNumericColumn")
Valor personalizado
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
Agregar una columna NUMERIC
En el siguiente ejemplo, se muestra cómo agregar una columna NUMERIC
a una tabla llamada Venues
mediante las bibliotecas cliente de Spanner.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Actualizar datos de NUMERIC
En el siguiente ejemplo, se muestra cómo actualizar los datos NUMERIC
mediante las bibliotecas cliente de Spanner.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Consulta datos NUMERIC
En el siguiente ejemplo, se muestra cómo consultar los datos NUMERIC
con las bibliotecas cliente de Spanner.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
NUMERIC
se admite en el controlador JDBC de Spanner con el tipo BigDecimal de Java. Para ver ejemplos de cómo
si se usa NUMERIC
; consulta las muestras de código en
Conecta JDBC a una base de datos de dialectos de GoogleSQL.
Controla valores NUMERIC cuando se crea una biblioteca cliente o un controlador
El tipo NUMERIC
se codifica como una string en notación decimal o científica dentro de un .proto google.protobuf.Value. Este .proto se une como ResultSet, PartialResultSet o Mutation según si se lee o se escribe. ResultSetMetadata usará el TypeCode NUMERIC para indicar que el valor correspondiente debe leerse como un NUMERIC
.
Cuando trabajes con NUMERIC en una biblioteca cliente o un controlador que creas, observa la siguiente guía.
Para leer un
NUMERIC
desde el ResultSet, haz lo siguiente:Lee el string_value del proto google.protobuf.Value cuando TypeCode es
NUMERIC
Convierte esa string en el tipo correspondiente para el idioma específico
Para escribir un
NUMERIC
mediante mutaciones, usa la representación de string como string_value en el proto google.protobuf.Value cuando se le otorgue el tipo relevante.