1. ภาพรวมของประเภท ENUM
ENUM คืออะไร?
ประเภท ENUM (enumeration) ใน MySQL เป็นประเภทข้อมูลที่เก็บค่าเพียงค่าเดียวจากรายการที่กำหนดไว้ล่วงหน้า เนื่องจากคอลัมน์สามารถบันทึกสตริงที่กำหนดไว้เท่านั้น จึงช่วยให้ข้อมูลมีความสอดคล้องและป้องกันค่าที่ไม่ถูกต้องจากการแทรกเข้าไป
ตัวอย่างเช่น เมื่อผู้ใช้เลือกตัวเลือกหนึ่งจากตัวเลือกที่จำกัด เช่น เพศหรือหมวดหมู่สินค้า การใช้ประเภท ENUM จะทำให้ไม่ต้องเขียนตรรกะตรวจสอบข้อผิดพลาดที่ซับซ้อน ตัวอย่างต่อไปนี้เป็นการสร้างตารางที่มีคอลัมน์ ENUM:
CREATE TABLE products (
id INT AUTO_INCREMENT PRIMARY KEY,
category ENUM('食品', '衣料品', '家電', '家具') NOT NULL
);
ในตัวอย่างนี้ คอลัมน์ category สามารถเก็บค่าได้เพียงหนึ่งในค่าต่อไปนี้: “食品”, “衣料品”, “家電”, หรือ “家具” ซึ่งช่วยทำให้การจัดการข้อมูลง่ายขึ้นและลดความเสี่ยงของการป้อนข้อมูลที่ไม่ถูกต้อง
กรณีการใช้งานหลักของ ENUM
ประเภท ENUM มักใช้ในสถานการณ์ต่อไปนี้:
- การจัดการสถานะ : ติดตามขั้นตอนของกระบวนการทำงาน เช่น “未開始”, “進行中”, หรือ “完了”
- การกำหนดหมวดหมู่ : จัดการตัวเลือกที่กำหนดไว้ล่วงหน้า เช่น หมวดหมู่สินค้า, ประเภทผู้ใช้, หรือตำแหน่งงาน
- การจัดอันดับหรือการจัดกลุ่มระดับ : ระดับความยากของเกม (“初級”, “中級”, “上級”) หรือการให้คะแนนสินค้า (“良い”, “普通”, “悪い”)
2. ข้อดีและข้อเสียของ ENUM
ข้อดี
- เพิ่มความสอดคล้องของข้อมูล ENUM อนุญาตให้บันทึกเฉพาะค่าที่อยู่ในรายการที่กำหนดไว้เท่านั้น ทำให้การจัดการข้อมูลเป็นไปอย่างสอดคล้อง ตัวอย่างเช่น เมื่อจัดการเพศ จะยอมรับเฉพาะค่าที่กำหนดไว้เช่น “男性” หรือ “女性” เท่านั้น ซึ่งป้องกันการป้อนข้อมูลที่ไม่ถูกต้อง
- ใช้พื้นที่จัดเก็บอย่างมีประสิทธิภาพ ค่าของ ENUM แต่ละค่าถูกเก็บเป็นดัชนีจำนวนเต็มภายใน ดังนั้นจึงใช้พื้นที่น้อยกว่าชนิด VARCHAR ตัวอย่างเช่น ค่าที่เป็น ‘small’ หรือ ‘large’ จะใช้พื้นที่มากกว่าเมื่อเป็น VARCHAR แต่ ENUM จะเก็บเป็นดัชนีจำนวนเต็มอย่างมีประสิทธิภาพ
ข้อเสีย
- ขาดความยืดหยุ่น ค่าของ ENUM ถูกกำหนดไว้คงที่ การเพิ่มตัวเลือกใหม่ต้องแก้ไขโครงสร้างตาราง ทำให้ ENUM ไม่เหมาะกับชุดข้อมูลที่เปลี่ยนแปลงบ่อย
- การจัดการข้อผิดพลาดที่ซับซ้อน หากมีการแทรกค่าที่ไม่ถูกต้อง MySQL อาจส่งข้อผิดพลาดหรือบันทึกเป็นสตริงว่าง ซึ่งทำให้การดีบักสำหรับนักพัฒนาซับซ้อนขึ้น
3. การกำหนดค่า ENUM และการใช้งานจริง
การตั้งค่าเบื้องต้นและการจัดการข้อผิดพลาด
เพื่อกำหนดประเภท ENUM เพียงแค่ระบุรายการสตริงที่เป็นค่าที่ถูกต้อง ตัวอย่างต่อไปนี้กำหนดคอลัมน์ ENUM ในตาราง:
CREATE TABLE shirts (
id INT AUTO_INCREMENT PRIMARY KEY,
size ENUM('XS', 'S', 'M', 'L', 'XL') NOT NULL
);
ที่นี่ คอลัมน์ size ยอมรับเฉพาะ “XS”, “S”, “M”, “L”, หรือ “XL” การพยายามแทรกค่าที่ไม่อยู่ในรายการ (เช่น ‘XXL’) จะทำให้เกิดข้อผิดพลาด Data truncated ซึ่งช่วยป้องกันข้อมูลที่ไม่ถูกต้องและรักษาความสอดคล้อง
ตัวอย่างการใช้งานจริง
ตัวอย่างต่อไปนี้ใช้ ENUM เพื่อจัดการบทบาทของผู้ใช้ เช่น “管理者”, “一般ユーザー”, และ “ゲスト”:
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
role ENUM('管理者', '一般ユーザー', 'ゲスト') NOT NULL
);
การใช้คอลัมน์ ENUM ทำให้การบำรุงรักษาการกำหนดสิทธิ์และการควบคุมตามบทบาทเป็นเรื่องง่าย

4. การทำดัชนีและการจัดการ NULL กับ ENUM
การใช้ดัชนี
ค่าของ ENUM จะได้รับดัชนีจำนวนเต็มตามตำแหน่งในรายการ ตัวอย่างเช่น:
CREATE TABLE products (
id INT AUTO_INCREMENT PRIMARY KEY,
size ENUM('S', 'M', 'L', 'XL')
);
“S” มีดัชนี 1, “M” มีดัชนี 2, เป็นต้น ดัชนีเหล่านี้สามารถใช้ในเงื่อนไข WHERE ได้:
SELECT * FROM products WHERE size = 2;
คิวรีนี้จะดึงบันทึกที่ขนาดตรงกับ “M”
การจัดการ NULL และสตริงว่าง
หากอนุญาตให้เป็น NULL คอลัมน์อาจเก็บค่า NULL เป็นสถานะที่ถูกต้องแม้ว่าจะไม่อยู่ในรายการ ENUM นอกจากนี้ ข้อมูลที่ไม่ถูกต้องที่แทรกเป็นสตริงว่างจะถูกเก็บด้วยดัชนี 0 ทำให้การตรวจจับข้อมูลที่ผิดพลาดทำได้ง่าย
5. ชุดอักขระและการจัดเรียงสำหรับ ENUM
วิธีตั้งค่าชุดอักขระและการจัดเรียง
(เนื้อหาต่อไปนี้ยังไม่ได้ระบุ; โปรดเพิ่มรายละเอียดตามความต้องการ)
ENUM เช่น CHAR หรือ VARCHAR รองรับการกำหนดชุดอักขระและการจัดเรียง (collation) สิ่งนี้สำคัญเมื่อจัดการข้อมูลหลายภาษา หรือการเรียงลำดับ ตัวอย่าง:
CREATE TABLE documents (
id INT AUTO_INCREMENT PRIMARY KEY,
language ENUM('日本語', '英語', '中国語')
CHARACTER SET utf8
COLLATE utf8_general_ci
);
ตัวอย่างนี้ระบุ UTF-8 และการจัดเรียงแบบทั่วไป
6. การขยาย ENUM และทางเลือก
เทคนิคการขยาย ENUM
เนื่องจาก ENUM ขาดความยืดหยุ่นสำหรับค่าที่เปลี่ยนแปลงได้ คุณสามารถเพิ่มตัวเลือก “อื่น ๆ” และเก็บข้อมูลที่ผู้ใช้ป้อนแบบอิสระในคอลัมน์แยก:
ALTER TABLE products
MODIFY COLUMN category ENUM('食品', '衣料品', '家電', '家具', 'その他') NOT NULL,
ADD COLUMN category_other VARCHAR(255) DEFAULT NULL;
วิธีนี้ทำให้สามารถเก็บค่าที่ไม่ได้อยู่ในรายการ ENUM ได้ในขณะที่ยังคงโครงสร้าง
ชนิดข้อมูลทางเลือก: SET หรือ VARCHAR
ขึ้นอยู่กับความต้องการ ทางเลือกได้แก่:
- SET type : เก็บการเลือกหลายรายการจากรายการหนึ่ง
- VARCHAR : ให้ความยืดหยุ่นสูงสุดโดยไม่มีข้อจำกัดที่กำหนดไว้ล่วงหน้า


