วิธีการเก็บจำนวนเต็มหนึ่งไบต์ใน PostgreSQL


14

ในเอกสาร PostgreSQL มีการกล่าวกันว่าชนิดข้อมูลจำนวนเต็มสามารถเก็บไว้ในพื้นที่สอง, สี่หรือแปดไบต์ หนึ่งในคอลัมน์ของตารางในฐานข้อมูลของฉันมีค่าจำนวนเต็มหนึ่งไบต์และฉันต้องการเก็บไว้ในประเภทข้อมูลหนึ่งไบต์

  1. มีส่วนขยายหรือวิธีใช้ชนิดข้อมูลจำนวนเต็มหนึ่งไบต์ใน PostgreSQL หรือไม่
  2. NUMERIC (1,0) มีกี่ไบต์

คำตอบ:


16

ไม่ไม่มีจำนวนเต็ม 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โดยตรงเพื่อแก้ไขปัญหาทั้งสอง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.