O Spanner suporta um tipo de dados NUMERIC
nas bases de dados GoogleSQL e PostgreSQL.
GoogleSQL NUMERIC
O NUMERIC
do GoogleSQL é um tipo de dados numérico exato capaz de representar um valor numérico exato com uma precisão de 38 e uma escala de 9. Esta página oferece uma vista geral de como NUMERIC
é representado nas bibliotecas de cliente.
PostgreSQL NUMERIC
O tipo NUMERIC
do PostgreSQL é um tipo de dados numérico de precisão decimal arbitrária com uma precisão máxima (dígitos totais) de 147 455 e uma escala máxima (dígitos à direita do ponto decimal) de 16 383.
O DDL do Spanner não suporta a especificação da precisão e da escala para colunas NUMERIC
do PostgreSQL. No entanto, os valores numéricos podem ser convertidos em valores de precisão fixa em declarações DML. Por exemplo:
update t1 set numeric_column = (numeric_column*0.8)::numeric(5,2);
O tipo DECIMAL
é um alias de NUMERIC
.
Não é possível usar colunas do PostgreSQL NUMERIC
quando especificar chaves principais, chaves estrangeiras ou índices secundários.
Represente NUMERIC em cada linguagem da biblioteca cliente
Para manter a fidelidade dos valores NUMERIC
, cada biblioteca
cliente armazena esses valores num tipo de dados adequado no idioma da biblioteca
cliente. A tabela seguinte lista os tipos de dados aos quais NUMERIC
é mapeado em cada idioma suportado.
Idioma | GoogleSQL | PostgreSQL |
---|---|---|
C++ | spanner::Numeric | |
C# | SpannerNumeric | |
Go | big.Rat | Custom PGNumeric |
Java | BigDecimal | Tipo personalizado. Consulte as notas da biblioteca Java do PostgreSQL. |
Node.js | Big | |
PHP | Numérico personalizado | |
Python | Decimal | Decimal com anotação personalizada |
Ruby | BigDecimal |
Três bibliotecas cliente, C++, C# e PHP, implementaram cada uma um tipo personalizado para representar o tipo NUMERIC
do SQL do Spanner. Todas as outras bibliotecas usam um tipo existente.
O objeto spanner::Numeric
da biblioteca de cliente C++ não suporta operações aritméticas. Em alternativa, converta o número contido no objeto C++ à sua escolha.
Por exemplo, pode extrair o número como uma string, que representaria o número com total fidelidade e sem perda de dados. No entanto, se souber antecipadamente que o número se enquadra, por exemplo, no intervalo de std:int64_t
ou double
, pode aceder ao valor como esse tipo.
Notas sobre a biblioteca Java do PostgreSQL
A biblioteca cliente Java do Spanner usa um tipo Value.pgNumeric
personalizado para armazenar valores NUMERIC do PostgreSQL.
Escrever numa coluna NUMERIC
São suportados vários tipos quando escreve numa coluna NUMERIC numa tabela PostgreSQL.
Numéricos
INSERT INTO Table (id, PgNumericColumn) VALUES (1, 1.23)
Números inteiros
INSERT INTO Table (id, PgNumericColumn) VALUES (1, 1)
Pares
INSERT INTO Table (id, PgNumericColumn) VALUES (1, 1.23::float8)
Literais não tipados
INSERT INTO Table (id, PgNumericColumn) VALUES (1, 'NaN')
Consultas parametrizadas
Quando usar consultas parametrizadas, especifique os parâmetros com $<index>
, onde <index>
indica a posição do parâmetro. O parâmetro deve ser associado através de p<index>
. Por exemplo,
INSERT INTO MyTable (PgNumericColumn) VALUES ($1)
com o parâmetro a ser
p1
.
A biblioteca cliente Java suporta os seguintes tipos como valores parametrizados:
Personalizado
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()
Pares
Statement .newBuilder("INSERT INTO MyTable (PgNumericColumn) VALUES ($1), ($2)") .bind("p1") .to(1.23D) .bind("p2") .to(Double.NaN) .build()
Números inteiros
Statement .newBuilder("INSERT INTO MyTable (PgNumericColumn) VALUES ($1)") .bind("p1") .to(1) .build()
Longos
Statement .newBuilder("INSERT INTO MyTable (PgNumericColumn) VALUES ($1)") .bind("p1") .to(1L) .build()
Mutações
Quando usar mutações, os seguintes valores podem ser escritos em colunas de tipo numérico:
Strings
Mutation .newInsertBuilder("MyTable") .set("PgNumericColumn") .to("1.23") .build()
Valores de tipos BigDecimal
BigDecimals
Mutation .newInsertBuilder("MyTable") .set("PgNumericColumn") .to(new BigDecimal("1.23")) .build()
Ints
Mutation .newInsertBuilder("MyTable") .set("PgNumericColumn") .to(1) .build()
Longos
Mutation .newInsertBuilder("MyTable") .set("PgNumericColumn") .to(1L) .build()
Valores obtidos como resultado de uma chamada a Value.pgNumeric
Mutation .newInsertBuilder("MyTable") .set("PgNumericColumn") .to(Value.pgNumeric("1.23")) .build()
Obter de uma coluna NUMERIC
Para obter valores armazenados em colunas numéricas de um ResultSet,
use ResultSet.getString()
ou 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
Adicione uma coluna NUMÉRICA
O exemplo seguinte mostra como adicionar uma coluna NUMERIC
a uma tabela denominada Venues
através das bibliotecas cliente do Spanner.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Atualize dados NUMÉRICOS
O exemplo seguinte mostra como atualizar os dados de NUMERIC
através das bibliotecas de cliente do Spanner.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Consultar dados NUMÉRICOS
O exemplo seguinte mostra como consultar dados de NUMERIC
através das bibliotecas cliente do Spanner.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
O tipo NUMERIC
é suportado no controlador JDBC do Spanner através do tipo Java BigDecimal. Para ver exemplos de como o elemento
NUMERIC
é usado, consulte os exemplos de código em
Ligue o JDBC a uma base de dados com dialeto GoogleSQL.
Trate o tipo NUMERIC ao criar uma biblioteca ou um controlador cliente
O tipo NUMERIC
é codificado como uma string em notação decimal ou científica
num proto google.protobuf.Value. Este proto é apresentado como um ResultSet, um PartialResultSet ou uma Mutation, consoante esteja a ser lido ou escrito. ResultSetMetadata usa o NUMERIC
TypeCode para indicar que o valor correspondente deve ser lido como um
NUMERIC
.
Quando trabalhar com NUMERIC numa biblioteca ou num controlador cliente que criar, siga estas orientações.
Para ler um
NUMERIC
do ResultSet:Leia o string_value do proto google.protobuf.Value quando TypeCode for
NUMERIC
Converter essa string no tipo relevante para o idioma indicado
Para escrever um
NUMERIC
usando mutações, use a representação de string como o string_value no proto google.protobuf.Value quando lhe for dado o tipo relevante.