Pembicaraan tentang DOMAIN menarik tetapi tidak relevan dengan satu-satunya kemungkinan asal pertanyaan itu. Keinginan untuk unsigned int adalah untuk menggandakan rentang int dengan jumlah bit yang sama, ini adalah argumen efisiensi, bukan keinginan untuk mengecualikan angka negatif, semua orang tahu bagaimana menambahkan batasan cek.
Ketika ditanya oleh seseorang tentang hal itu , Tome Lane menyatakan:
Pada dasarnya, tidak ada kemungkinan hal ini akan terjadi kecuali Anda dapat menemukan cara untuk memasangnya ke dalam hierarki promosi numerik yang tidak merusak banyak aplikasi yang ada. Kami telah melihat ini lebih dari sekali, jika memori berfungsi, dan gagal menghasilkan desain yang bisa diterapkan yang tampaknya tidak melanggar POLA.
Apa itu "POLA"? Google memberi saya 10 hasil yang tidak berarti . Tidak yakin apakah itu pemikiran yang salah secara politis dan karena itu disensor. Mengapa istilah pencarian ini tidak membuahkan hasil? Masa bodo.
Anda dapat mengimplementasikan unsigned int sebagai jenis ekstensi tanpa terlalu banyak kesulitan. Jika Anda melakukannya dengan fungsi-C, maka tidak akan ada penalti kinerja sama sekali. Anda tidak perlu memperluas parser untuk menangani literal karena PgSQL memiliki cara yang mudah untuk menafsirkan string sebagai literal, cukup tulis '4294966272' :: uint4 sebagai literal Anda. Pemain juga seharusnya tidak menjadi masalah besar. Anda bahkan tidak perlu melakukan pengecualian rentang, Anda cukup memperlakukan semantik '4294966273' :: uint4 :: int sebagai -1024. Atau Anda bisa membuat kesalahan.
Jika saya menginginkan ini, saya akan melakukannya. Tetapi karena saya menggunakan Java di sisi lain SQL, bagi saya nilainya kecil karena Java juga tidak memiliki bilangan bulat yang tidak ditandatangani. Jadi saya tidak mendapatkan apa-apa. Saya sudah kesal jika saya mendapatkan BigInteger dari kolom bigint, padahal harus muat menjadi panjang.
Hal lain, jika saya memiliki kebutuhan untuk menyimpan tipe 32 bit atau 64 bit, saya dapat menggunakan PostgreSQL int4 atau int8 masing-masing, hanya dengan mengingat bahwa urutan natural atau aritmatika tidak akan bekerja dengan andal. Tapi menyimpan dan mengambil tidak terpengaruh olehnya.
Berikut adalah bagaimana saya dapat mengimplementasikan unsigned int8 sederhana:
Pertama saya akan gunakan
CREATE TYPE name (
INPUT = uint8_in,
OUTPUT = uint8_out
[, RECEIVE = uint8_receive ]
[, SEND = uint8_send ]
[, ANALYZE = uint8_analyze ]
, INTERNALLENGTH = 8
, PASSEDBYVALUE ]
, ALIGNMENT = 8
, STORAGE = plain
, CATEGORY = N
, PREFERRED = false
, DEFAULT = null
)
minimal 2 fungsi uint8_in
dan uint8_out
saya harus mendefinisikan terlebih dahulu.
CREATE FUNCTION uint8_in(cstring)
RETURNS uint8
AS 'uint8_funcs'
LANGUAGE C IMMUTABLE STRICT;
CREATE FUNCTION uint64_out(complex)
RETURNS cstring
AS 'uint8_funcs'
LANGUAGE C IMMUTABLE STRICT;
perlu menerapkan ini di C uint8_funcs.c. Jadi saya menggunakan contoh kompleks dari sini dan membuatnya sederhana:
PG_FUNCTION_INFO_V1(complex_in);
Datum complex_in(PG_FUNCTION_ARGS) {
char *str = PG_GETARG_CSTRING(0);
uint64_t result;
if(sscanf(str, "%llx" , &result) != 1)
ereport(ERROR,
(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
errmsg("invalid input syntax for uint8: \"%s\"", str)));
return (Datum)SET_8_BYTES(result);
}
ah baiklah, atau Anda bisa menemukannya sudah selesai .