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 - NUMERICdo 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 - NUMERICusando mutações, use a representação de string como o string_value no proto google.protobuf.Value quando lhe for dado o tipo relevante.