Spanner mendukung jenis data NUMERIC
di database GoogleSQL dan PostgreSQL.
NUMERIK GoogleSQL
NUMERIC
GoogleSQL adalah
jenis data numerik persis yang mampu merepresentasikan nilai numerik yang tepat dengan
presisi 38 dan skala 9. Halaman ini memberikan ringkasan tentang cara NUMERIC
direpresentasikan dalam library klien.
NUMERIC PostgreSQL
Jenis NUMERIC
PostgreSQL adalah jenis data numerik presisi desimal arbitrer dengan presisi maksimum (total digit) 147.455 dan skala maksimum (digit di sebelah kanan titik desimal) 16.383.
DDL Spanner tidak mendukung penentuan presisi dan skala untuk kolom NUMERIC
PostgreSQL. Namun, nilai numerik dapat dikonversi menjadi nilai presisi tetap dalam pernyataan DML. Contoh:
update t1 set numeric_column = (numeric_column*0.8)::numeric(5,2);
Jenis DECIMAL
adalah alias untuk NUMERIC
.
Kolom NUMERIC
PostgreSQL tidak dapat digunakan saat menentukan kunci utama, kunci asing, atau indeks sekunder.
Merepresentasikan NUMERIC di setiap bahasa library klien
Untuk mempertahankan fidelitas nilai NUMERIC
, setiap library klien Spanner menyimpan nilai tersebut dalam jenis data yang sesuai di bahasa library klien. Tabel berikut mencantumkan jenis data yang akan digunakan untuk memetakan NUMERIC
dalam setiap bahasa yang didukung.
Language | GoogleSQL | PostgreSQL |
---|---|---|
C++ | kunci pas::Numerik | |
C# | SpannerNumeric | |
Go | big.Rat | PGNumeric Kustom |
Java | BigDecimal | Jenis kustom. Lihat catatan library Java PostgreSQL. |
Node.js | Besar | |
PHP | Numerik khusus | |
Python | Desimal | Desimal dengan anotasi kustom |
Ruby | BigDecimal |
Tiga library klien, C++, C#, dan PHP masing-masing telah mengimplementasikan jenis kustom untuk
mewakili jenis NUMERIC
Spanner SQL. Semua library lain menggunakan
jenis yang sudah ada.
Objek spanner::Numeric
library klien C++ tidak mendukung operasi
aritmetika. Sebagai gantinya, konversikan angka yang ada ke objek C++ pilihan.
Misalnya, Anda dapat mengekstrak angka sebagai string, yang akan mewakili
angka tersebut pada fidelitas penuh dan tanpa kehilangan data. Namun, jika Anda mengetahui sebelumnya
bahwa angka tersebut cocok, misalnya, dalam rentang std:int64_t
atau double
,
Anda dapat mengakses nilai sebagai jenis tersebut.
Catatan library Java PostgreSQL
Library klien Java Spanner menggunakan jenis Value.pgNumeric
kustom
untuk menyimpan nilai NUMERIC PostgreSQL.
Menulis ke kolom NUMERIC
Beberapa jenis didukung saat menulis ke kolom NUMERIC di tabel PostgreSQL.
Numerik
INSERT INTO Table (id, PgNumericColumn) VALUES (1, 1.23)
Bilangan bulat
INSERT INTO Table (id, PgNumericColumn) VALUES (1, 1)
Ganda
INSERT INTO Table (id, PgNumericColumn) VALUES (1, 1.23::float8)
Literal tanpa jenis
INSERT INTO Table (id, PgNumericColumn) VALUES (1, 'NaN')
Kueri berparameter
Saat menggunakan kueri berparameter, tentukan parameter dengan $<index>
, dengan <index>
menunjukkan posisi parameter. Kemudian parameter harus
diikat menggunakan p<index>
. Misalnya,
INSERT INTO MyTable (PgNumericColumn) VALUES ($1)
dengan parameternya
p1
.
Library klien Java mendukung jenis berikut sebagai parameter value:
Khusus
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()
Ganda
Statement .newBuilder("INSERT INTO MyTable (PgNumericColumn) VALUES ($1), ($2)") .bind("p1") .to(1.23D) .bind("p2") .to(Double.NaN) .build()
Bilangan bulat
Statement .newBuilder("INSERT INTO MyTable (PgNumericColumn) VALUES ($1)") .bind("p1") .to(1) .build()
Panjang
Statement .newBuilder("INSERT INTO MyTable (PgNumericColumn) VALUES ($1)") .bind("p1") .to(1L) .build()
Mutasi
Ketika menggunakan Mutasi, nilai berikut diizinkan untuk ditulis ke kolom jenis numerik:
String
Mutation .newInsertBuilder("MyTable") .set("PgNumericColumn") .to("1.23") .build()
Nilai jenis BigDecimal
BigDecimals
Mutation .newInsertBuilder("MyTable") .set("PgNumericColumn") .to(new BigDecimal("1.23")) .build()
Int
Mutation .newInsertBuilder("MyTable") .set("PgNumericColumn") .to(1) .build()
Panjang
Mutation .newInsertBuilder("MyTable") .set("PgNumericColumn") .to(1L) .build()
Nilai yang diperoleh sebagai hasil dari panggilan ke Value.pgNumeric
Mutation .newInsertBuilder("MyTable") .set("PgNumericColumn") .to(Value.pgNumeric("1.23")) .build()
Ambil dari NUMERIC kolom
Untuk mendapatkan nilai yang disimpan dalam kolom numerik ResultSet, gunakan ResultSet.getString()
atau ResultSet.getValue()
.
String
resultSet.getString("PgNumericColumn")
Nilai Khusus
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
Tambahkan kolom NUMERIC
Contoh berikut menunjukkan cara menambahkan kolom NUMERIC
ke tabel bernama
Venues
menggunakan library klien Spanner.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Perbarui data NUMERIC
Contoh berikut menunjukkan cara mengupdate data NUMERIC
menggunakan library klien Spanner.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Buat kueri data NUMERIC
Contoh berikut menunjukkan cara membuat kueri data NUMERIC
menggunakan library klien Spanner.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
NUMERIC
didukung dalam driver JDBC Spanner menggunakan jenis
BigDecimal Java. Untuk contoh cara
penggunaan NUMERIC
, lihat contoh kode di
Menghubungkan JDBC ke database dialek GoogleSQL.
Menangani NUMERIC saat membuat driver atau library klien
Jenis NUMERIC
dienkode sebagai string dalam notasi desimal atau ilmiah
dalam proto google.protobuf.Value. Proto ini digabungkan sebagai
ResultSet, PartialResultSet, atau Mutation bergantung pada apakah
prototipe tersebut sedang dibaca atau ditulis. ResultSetMetadata akan menggunakan NUMERIC
TypeCode untuk menunjukkan bahwa nilai yang sesuai harus dibaca sebagai
NUMERIC
.
Saat menggunakan NUMERIC di library klien atau driver yang Anda buat, amati panduan berikut.
Untuk membaca
NUMERIC
dari ResultSet:Membaca string_value dari proto google.protobuf.Value jika TypeCode adalah
NUMERIC
Konversi string tersebut ke jenis yang relevan untuk bahasa yang diberikan
Untuk menulis
NUMERIC
menggunakan Mutasi, gunakan representasi string sebagai string_value dalam proto google.protobuf.Value saat diberi jenis yang relevan.