การพูดคุยเกี่ยวกับ DOMAINS นั้นน่าสนใจ แต่ไม่เกี่ยวข้องกับที่มาที่เป็นไปได้เพียงประการเดียวของคำถามนั้น ความปรารถนาสำหรับ ints ที่ไม่ได้ลงนามคือการเพิ่มช่วงของ ints เป็นสองเท่าด้วยจำนวนบิตเท่ากันมันเป็นอาร์กิวเมนต์ที่มีประสิทธิภาพไม่ใช่ความปรารถนาที่จะยกเว้นตัวเลขเชิงลบทุกคนรู้วิธีเพิ่มข้อ จำกัด ในการตรวจสอบ
เมื่อมีคนถามเกี่ยวกับเรื่องนี้ Tome Lane กล่าวว่า:
โดยทั่วไปแล้วจะไม่มีโอกาสเกิดขึ้นเว้นแต่คุณจะสามารถหาวิธีปรับให้เข้ากับลำดับชั้นการโปรโมตแบบตัวเลขที่ไม่ทำลายแอปพลิเคชันที่มีอยู่จำนวนมากได้ เราได้ตรวจสอบสิ่งนี้มากกว่าหนึ่งครั้งหากหน่วยความจำทำงานและล้มเหลวในการออกแบบที่ใช้งานได้ซึ่งดูเหมือนจะไม่ละเมิด POLA
"POLA" คืออะไร? Google ให้ผม 10 ผลลัพธ์ที่มีความหมาย ไม่แน่ใจว่าเป็นความคิดที่ไม่ถูกต้องทางการเมืองจึงถูกเซ็นเซอร์ เหตุใดข้อความค้นหานี้จึงไม่ให้ผลลัพธ์ใด ๆ ก็ตาม.
คุณสามารถใช้ ints ที่ไม่ได้ลงชื่อเป็นประเภทส่วนขยายได้โดยไม่มีปัญหามากเกินไป หากคุณใช้ฟังก์ชัน C จะไม่มีบทลงโทษเกี่ยวกับประสิทธิภาพเลย คุณไม่จำเป็นต้องขยายตัวแยกวิเคราะห์เพื่อจัดการกับตัวอักษรเนื่องจาก PgSQL มีวิธีง่ายๆในการตีความสตริงเป็นตัวอักษรเพียงเขียน '4294966272' :: uint4 เป็นตัวอักษรของคุณ การร่ายไม่ควรเป็นเรื่องใหญ่เช่นกัน คุณไม่จำเป็นต้องทำข้อยกเว้นช่วงคุณสามารถจัดการความหมายของ '4294966273' :: uint4 :: int เป็น -1024 ได้ หรือคุณสามารถโยนข้อผิดพลาด
ถ้าฉันต้องการสิ่งนี้ฉันจะทำมัน แต่เนื่องจากฉันใช้ Java ในอีกด้านหนึ่งของ SQL สำหรับฉันแล้วมันมีค่าเพียงเล็กน้อยเนื่องจาก Java ไม่มีจำนวนเต็มที่ไม่ได้ลงชื่อ ดังนั้นฉันจึงไม่ได้รับอะไรเลย ฉันรู้สึกรำคาญอยู่แล้วถ้าฉันได้รับ BigInteger จากคอลัมน์ bigint เมื่อมันควรจะยาว
อีกประการหนึ่งถ้าฉันมีความจำเป็นในการจัดเก็บประเภท 32 บิตหรือ 64 บิตฉันสามารถใช้ PostgreSQL int4 หรือ int8 ตามลำดับเพียงแค่จำไว้ว่าลำดับธรรมชาติหรือเลขคณิตจะไม่ทำงานอย่างน่าเชื่อถือ แต่การจัดเก็บและการเรียกคืนจะไม่ได้รับผลกระทบจากสิ่งนั้น
นี่คือวิธีที่ฉันสามารถใช้ int8 แบบธรรมดาที่ไม่ได้ลงชื่อ:
ก่อนอื่นฉันจะใช้
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
)
น้อยที่สุด 2 ฟังก์ชั่นuint8_in
และuint8_out
ฉันต้องกำหนดก่อน
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;
จำเป็นต้องใช้สิ่งนี้ใน C uint8_funcs.c ดังนั้นฉันจะใช้ตัวอย่างที่ซับซ้อนจากที่นี่และทำให้มันง่าย:
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);
}
อาดีหรือคุณสามารถเพียงแค่พบว่ามันทำมาแล้ว