Spanner mendukung jenis data NUMERIC
di database GoogleSQL dan PostgreSQL.
NUMERIC GoogleSQL
NUMERIC
GoogleSQL adalah
jenis data numerik pasti yang mampu merepresentasikan nilai numerik pasti dengan
presisi 38 dan skala 9. Halaman ini memberikan ringkasan tentang cara NUMERIC
direpresentasikan di library klien.
NUMERIC PostgreSQL
Jenis NUMERIC
PostgreSQL adalah jenis data numerik dengan 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 di-casting ke 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.
Menampilkan NUMERIC dalam setiap bahasa library klien
Untuk mempertahankan keakuratan nilai NUMERIC
, setiap pustaka
klien Spanner menyimpan nilai tersebut dalam jenis data yang sesuai di bahasa pustaka
klien. Tabel berikut mencantumkan jenis data yang dipetakan ke NUMERIC
dalam setiap bahasa yang didukung.
Bahasa | GoogleSQL | PostgreSQL |
---|---|---|
C++ | spanner::Numeric | |
C# | SpannerNumeric | |
Go | big.Rat | PGNumeric Kustom |
Java | BigDecimal | Jenis kustom. Lihat catatan library Java PostgreSQL. |
Node.js | Big | |
PHP | Angka kustom | |
Python | Desimal | Desimal dengan anotasi kustom |
Ruby | BigDecimal |
Tiga library klien, C++, C#, dan PHP, masing-masing telah menerapkan jenis kustom untuk merepresentasikan jenis NUMERIC
Spanner SQL. Semua library lainnya menggunakan jenis yang ada.
Objek spanner::Numeric
library klien C++ tidak mendukung operasi
aritmetika. Sebagai gantinya, konversikan angka yang ada ke objek C++ yang diinginkan.
Misalnya, Anda dapat mengekstrak angka sebagai string, yang akan merepresentasikan
angka dengan 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 dalam 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 yang tidak diketik
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 parameter
p1
.
Library klien Java mendukung jenis berikut sebagai nilai berparameter:
Kustom
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
Saat menggunakan Mutasi, nilai berikut diizinkan untuk ditulis ke kolom jenis angka:
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()
Mengambil dari kolom NUMERIC
Untuk mendapatkan nilai yang disimpan dalam kolom numerik ResultSet,
gunakan ResultSet.getString()
atau ResultSet.getValue()
.
String
resultSet.getString("PgNumericColumn")
Nilai Kustom
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
Menambahkan 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
Memperbarui data NUMERIC
Contoh berikut menunjukkan cara mengupdate data NUMERIC
menggunakan library klien Spanner.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Membuat 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 di driver JDBC Spanner menggunakan jenis
BigDecimal Java. Untuk contoh penggunaan
NUMERIC
, lihat contoh kode di
Menghubungkan JDBC ke database dialek GoogleSQL.
Menangani NUMERIK saat membuat library klien atau driver
Jenis NUMERIC
dienkode sebagai string dalam notasi desimal atau ilmiah dalam proto google.protobuf.Value. Proto ini di-wrap sebagai
ResultSet, PartialResultSet, atau Mutation, bergantung pada apakah
proto tersebut sedang dibaca atau ditulis. ResultSetMetadata akan menggunakan NUMERIC
TypeCode untuk menunjukkan bahwa nilai yang sesuai harus dibaca sebagai
NUMERIC
.
Saat bekerja dengan NUMERIC di library klien atau driver yang Anda buat, perhatikan panduan berikut.
Untuk membaca
NUMERIC
dari ResultSet:Baca string_value dari proto google.protobuf.Value saat 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.