Spanner admite un tipo de datos NUMERIC
en las bases de datos de GoogleSQL y PostgreSQL.
NUMERIC de GoogleSQL
El NUMERIC
de GoogleSQL es un tipo de datos numéricos exactos 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.
PostgreSQL NUMERIC
El tipo NUMERIC
de PostgreSQL es un tipo de datos numéricos de precisión decimal arbitraria con 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.
Spanner DDL no admite la especificación de precisión y escalamiento para
las columnas NUMERIC
de PostgreSQL. Sin embargo, los valores numéricos se pueden convertir a valores de precisión fijos en las 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, claves externas o índices secundarios.
Representa NUMERIC en el lenguaje de cada biblioteca cliente
Para mantener la fidelidad de los valores de 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.
Lenguaje | GoogleSQL | PostgreSQL |
---|---|---|
C++ | spanner::Numeric | |
C# | SpannerNumeric | |
Go | big.Rat | PGNumérico 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 |
Rita | BigDecimal |
Tres bibliotecas cliente, C++, C# y PHP, implementaron 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 sabes de antemano que ese número cabe, 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 a fin de almacenar valores NUMERIC de PostgreSQL.
Escribir en una columna NUMERIC
Se admiten varios tipos cuando se escribe en una columna NUMERIC en 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, especifica los parámetros con $<index>
, en el que <index>
denota la posición del parámetro. Luego, el parámetro debe vincularse 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 usas 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
con las bibliotecas cliente de Spanner.
C++
C#
Go
Java
Node.js
PHP
Python
Rita
Actualizar datos de NUMERIC
En el siguiente ejemplo, se muestra cómo actualizar los datos de NUMERIC
con las bibliotecas cliente de Spanner.
C++
C#
Go
Java
Node.js
PHP
Python
Rita
Consulta datos NUMERIC
En el siguiente ejemplo, se muestra cómo consultar datos de NUMERIC
con las bibliotecas cliente de Spanner.
C++
C#
Go
Java
Node.js
PHP
Python
Rita
NUMERIC
es compatible con el controlador JDBC de Spanner mediante el tipo BigDecimal de Java. Para ver ejemplos de cómo se usa NUMERIC
, consulta las muestras de código en Cómo conectar JDBC a una base de datos de dialectos de GoogleSQL.
Controla NUMERIC cuando creas 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.