// PostgreSQL Data Types

PostgreSQL Data Types

คู่มืออ้างอิง Data Types ครบถ้วน — PostgreSQL มี Built-in Types มากกว่าฐานข้อมูลอื่นใด และยังสร้าง Custom Types ได้เองอีกด้วย

// Numeric Types

ประเภทตัวเลข

TypeStorageRangeการใช้งาน
SMALLINT2 bytes-32,768 ถึง 32,767ค่าตัวเลขเล็กน้อย เช่น Age, Rating
INTEGER4 bytes-2.1B ถึง 2.1BPrimary Keys, General Numbers
BIGINT8 bytes±9.2 × 10¹⁸Large IDs, Financial, Timestamps
NUMERIC(p,s)Variableถึง 131072 digitsการเงิน ต้องการความแม่นยำ 100%
REAL4 bytes6 decimal digitsScientific calculations (approximate)
DOUBLE PRECISION8 bytes15 decimal digitsHigh-precision floating point
SMALLSERIAL2 bytes1 ถึง 32,767Auto-increment Small ID
SERIAL4 bytes1 ถึง 2.1BAuto-increment ID (legacy)
BIGSERIAL8 bytes1 ถึง 9.2×10¹⁸Auto-increment Large ID

💡 แนะนำ: ใช้ IDENTITY แทน SERIAL

PostgreSQL 10+ แนะนำให้ใช้ GENERATED ALWAYS AS IDENTITY แทน SERIAL เพราะเป็น SQL Standard และควบคุมได้ดีกว่า

// Character Types

ประเภทข้อความ

TypeStorageความแตกต่างการใช้งาน
CHAR(n)Fixed n bytesPad ด้วย spacesCodes ที่มีความยาวคงที่ เช่น รหัสประเทศ
VARCHAR(n)Variable ≤ nไม่ Pad spacesNames, Emails, Short Text ที่มี Max Length
TEXTVariable unlimitedไม่จำกัดความยาวLong Text, Articles, Descriptions — แนะนำ!

💡 TEXT คือตัวเลือกที่ดีที่สุดใน PostgreSQL

PostgreSQL เก็บ TEXT และ VARCHAR อย่างมีประสิทธิภาพเหมือนกัน แต่ TEXT ง่ายกว่าในการใช้งาน ไม่ต้องกังวลเรื่อง Max Length

// Boolean

Boolean Type

TypeValuesStorage
BOOLEANTRUE / FALSE / NULL1 byte
-- PostgreSQL รับหลายรูปแบบ TRUE = 'true', 'yes', 'on', '1' FALSE = 'false', 'no', 'off', '0'
// Date & Time

วันที่และเวลา

TypeStorageRange
DATE4 bytes4713 BC ถึง 5874897 AD
TIME8 bytes00:00:00 ถึง 24:00:00
TIMESTAMP8 bytes4713 BC ถึง 294276 AD
TIMESTAMPTZ8 bytesTimestamp + Timezone
INTERVAL16 bytesDuration / Period
// JSON Types — PostgreSQL Exclusive

JSON & JSONB — จุดเด่นของ PostgreSQL

TypeStorage Formatข้อดีข้อเสียแนะนำใช้เมื่อ
JSONText (ตามที่ Input)รักษา Whitespace, Key OrderQuery ช้า ไม่มี Indexเก็บ Raw JSON ต้องการ Exact Replay
JSONBBinary (Parsed)Index ได้ (GIN), Query เร็วเขียนช้ากว่าเล็กน้อยแนะนำ! ใช้ทั่วไป Query/Filter
-- สร้าง Table ด้วย JSONB CREATE TABLE products ( id SERIAL PRIMARY KEY, name TEXT, attrs JSONB ); -- Index สำหรับ JSONB (GIN) CREATE INDEX idx_attrs ON products USING GIN(attrs); -- Query JSONB SELECT * FROM products WHERE attrs @> '{"color": "blue"}'; -- ดึงค่าจาก JSONB SELECT attrs->'color' AS color FROM products;
// Array Type — PostgreSQL Exclusive

Array Type

PostgreSQL รองรับ Array ของทุก Data Type — ไม่ต้องสร้าง Relation Table สำหรับข้อมูลง่ายๆ

-- Array Column CREATE TABLE articles ( id SERIAL PRIMARY KEY, title TEXT, tags TEXT[] ); -- Insert Array INSERT INTO articles (title, tags) VALUES ('PostgreSQL Guide', ARRAY['database','postgres','guide']); -- Query ด้วย ANY SELECT * FROM articles WHERE 'postgres' = ANY(tags); -- Query ด้วย @> (contains) SELECT * FROM articles WHERE tags @> ARRAY['postgres'];
// Special Types

Special & Advanced Types

Typeประเภทการใช้งาน
UUIDUnique IdentifierGlobal Unique ID (128-bit), ดีกว่า SERIAL สำหรับ Distributed Systems
INETNetwork AddressIP Address (IPv4/IPv6) พร้อม Network Operations
CIDRNetwork RangeIP Network Range เช่น 192.168.0.0/24
MACADDRMAC AddressHardware MAC Address
POINTGeometricจุดพิกัด (x,y) บน Plane
POLYGONGeometricรูปหลายเหลี่ยม
TSVECTORFull-Text SearchPreprocessed Text สำหรับ Full-Text Search
TSQUERYFull-Text SearchSearch Query สำหรับ Full-Text Search
BYTEABinaryBinary Data (images, files) — แบบ BLOB
XMLXML Documentเก็บและ Query ข้อมูล XML
INT4RANGERangeช่วงของ Integer เช่น [1, 100)
TSTZRANGERangeช่วงเวลาพร้อม Timezone

💡 PostgreSQL vs MySQL: Data Types

PostgreSQL มี Built-in Types มากกว่า MySQL อย่างมาก โดยเฉพาะ JSONB, Array, UUID, Range Types, Network Address Types และ Geometric Types ที่ MySQL ไม่มีหรือต้องใช้ Extension