ไม่ไม่มีจำนวนเต็ม 1 ไบต์ในการแจกแจงแบบมาตรฐานของ Postgres Postgres มาตรฐานในตัวทุกประเภทมีตัวเลขตั้งแต่ 2 ไบต์ขึ้นไป
pguint ส่วนขยาย
แต่ใช่มีส่วนขยายpguintซึ่งดูแลโดย Peter Eisentraut ซึ่งเป็นหนึ่งในผู้พัฒนาหลักของ Postgres มันไม่ได้เป็นส่วนหนึ่งของการแจกแจงมาตรฐาน:
นอกเหนือจากประเภทจำนวนเต็มที่ไม่ได้ลงนามหลากหลายประเภทแล้วมันยังมีจำนวนเต็ม 1 ไบต์ที่คุณต้องการ:
int1 (signed 8-bit integer)
uint1 (unsigned 8-bit integer)
uint2 (unsigned 16-bit integer)
uint4 (unsigned 32-bit integer)
uint8 (unsigned 64-bit integer)
อย่าลืมอ่านบท "การสนทนา" ที่ไซต์ที่เชื่อมโยงเพื่ออธิบายภาวะแทรกซ้อนที่อาจเกิดขึ้น คุณต้องใช้ความระมัดระวังในการพิมพ์อักขระและตัวอักษรตัวเลขเมื่อแนะนำประเภทจำนวนเต็มเพิ่มเติม ...
วิธีแก้ปัญหา
วิธีแก้ปัญหาแบบง่าย ๆ ที่เป็นไปได้คือการเข้ารหัสค่าจำนวนเต็ม 1 ไบต์เป็น"char"
"ประเภท" แบบง่าย 1 ตัวอักษร "ภายใน" ซึ่งใช้หน่วยเก็บข้อมูลไบต์เดียวจริง ๆ แล้วค่าไบต์ของจำนวนเต็ม 1 ไบต์ที่เซ็นชื่อครึ่งบนแสดงว่า อักขระ ASCII
คุณสามารถเข้ารหัสค่าในช่วงของ-128 ถึง 127 การสาธิต:
SELECT i
, i::"char"
, i::"char"::int
FROM generate_series(-128,127) i;
มีหลายอักขระที่ไม่ได้มีไว้สำหรับแสดง ดังนั้นเข้ารหัสก่อนที่คุณจะจัดเก็บและถอดรหัสก่อนที่คุณจะแสดง ...
ข้อควรจำ: "char"
เป็นประเภท "ภายใน" ที่มีไว้สำหรับการแจงนับที่ง่ายและราคาถูก ไม่ได้ออกแบบมาอย่างเป็นทางการสำหรับสิ่งที่เราทำที่นี่และไม่สามารถพกพาไปยัง RDBMS อื่นได้ ไม่มีการรับประกันโดยโครงการ Postgres สำหรับสิ่งนี้
ข้อเสนอแนะเริ่มต้นของฉันอยู่บนพื้นฐานของการสันนิษฐานว่าเราจะครอบคลุมช่วงของจำนวนเต็ม 1 ไบต์ที่ไม่ได้ลงนาม (0-255) และเราสามารถใช้text
เป็นสเต็ปปิ้งสโตนได้ อีวานชี้ให้เห็นข้อผิดพลาดในแบบของฉัน: มันใช้ได้กับหมายเลข 1 - 127 เท่านั้นและล้มเหลวในส่วนที่เหลือ ให้ใช้ช่วงจำนวนเต็ม -128 ถึง 127 และแปลงระหว่าง"char"
และinteger
โดยตรงเพื่อแก้ไขปัญหาทั้งสอง