1. ภาพรวมของประเภทข้อมูล ENUM
ENUM คืออะไร?
ประเภทข้อมูล MySQL ENUM (enumeration) จะเก็บค่าเพียงค่าเดียวจากรายการที่กำหนดไว้ล่วงหน้า เนื่องจากคอลัมน์สามารถบันทึกสตริงที่ระบุในรายการเท่านั้น จึงช่วยรักษาความสอดคล้องของข้อมูลและป้องกันการป้อนข้อมูลที่ไม่ถูกต้อง
ตัวอย่างเช่น เมื่อผู้ใช้ต้องเลือกตัวเลือกหนึ่งจากชุดที่จำกัด เช่น เพศหรือหมวดหมู่สินค้า การใช้ ENUM จะทำให้ไม่ต้องตรวจสอบความถูกต้องเพิ่มเติม ด้านล่างเป็นตัวอย่างการสร้างตารางที่มีคอลัมน์ ENUM:
CREATE TABLE products (
id INT AUTO_INCREMENT PRIMARY KEY,
category ENUM('Food', 'Clothing', 'Electronics', 'Furniture') NOT NULL
);
ในตัวอย่างนี้ คอลัมน์ “category” สามารถเก็บค่าได้เพียงหนึ่งค่าในสี่ค่าต่อไปนี้: “Food”, “Clothing”, “Electronics”, หรือ “Furniture” ซึ่งทำให้การจัดการข้อมูลง่ายขึ้นและลดความเสี่ยงของการป้อนข้อมูลที่ไม่ถูกต้อง
การใช้งานหลักของ ENUM
ประเภทข้อมูล ENUM ถูกใช้เป็นหลักในสถานการณ์ต่อไปนี้:
- การจัดการสถานะ : การระบุสถานะความก้าวหน้าของโครงการ เช่น “Not Started”, “In Progress”, และ “Completed”
- การจัดประเภท : การจัดการตัวเลือกประเภทที่กำหนดไว้ล่วงหน้า เช่น ผลิตภัณฑ์, ประเภทผู้ใช้, หรือบทบาทงาน
- การจัดอันดับ : ระดับความยากของเกม (“Beginner”, “Intermediate”, “Advanced”) หรือการให้คะแนนสินค้า (“Good”, “Average”, “Poor”)
2. ข้อดีและข้อเสียของ ENUM
ข้อดี
- การปรับปรุงความสมบูรณ์ของข้อมูล ด้วย ENUM ค่าที่บันทึกได้จะต้องอยู่ในรายการที่กำหนดไว้ล่วงหน้าเท่านั้น ทำให้ข้อมูลสอดคล้องและการจัดการง่ายขึ้น ตัวอย่างเช่น เมื่อจัดการเพศ ค่าที่อนุญาตจะเป็น “Male” หรือ “Female” เท่านั้น ซึ่งป้องกันการป้อนข้อมูลที่ไม่ถูกต้อง
- ประสิทธิภาพการจัดเก็บ แต่ละค่า ENUM จะถูกกำหนดดัชนีจำนวนเต็มภายใน ทำให้ค่าถูกเก็บเป็นจำนวนเต็ม เมื่อเทียบกับ VARCHAR จะลดการใช้พื้นที่เก็บข้อมูล ตัวอย่างเช่น การเก็บขนาดเช่น ‘small’ หรือ ‘large’ ด้วย VARCHAR จะใช้พื้นที่มากกว่า ในขณะที่กำหนดด้วย ENUM จะทำให้การจัดเก็บมีประสิทธิภาพมากขึ้น
ข้อเสีย
- ขาดความยืดหยุ่น เนื่องจาก ENUM ยอมรับค่าได้เฉพาะที่กำหนดไว้ล่วงหน้า การเพิ่มค่าตัวใหม่ต้องแก้ไขโครงสร้างตาราง ดังนั้นจึงไม่เหมาะกับสถานการณ์ที่ตัวเลือกเปลี่ยนแปลงบ่อยและเป็นแบบไดนามิก
- การจัดการข้อผิดพลาดที่ซับซ้อน หากมีการแทรกค่าที่ไม่ถูกต้อง อาจเกิดข้อผิดพลาดหรือบันทึกเป็นสตริงว่าง พฤติกรรมนี้อาจทำให้การดีบักสำหรับนักพัฒนาซับซ้อนขึ้น
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 เพื่อจัดการบทบาทผู้ใช้ (“Administrator”, “Regular User”, “Guest”):
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
role ENUM('Administrator', 'Regular User', 'Guest') NOT NULL
);
เมื่อกำหนดสิทธิ์ต่าง ๆ ตามบทบาท การใช้คอลัมน์ ENUM ทำให้การรักษาความสมบูรณ์ของข้อมูลเป็นเรื่องง่ายขึ้น. 
4. ดัชนีของ ENUM และการจัดการ NULL
การใช้ค่าดัชนี
แต่ละค่า ENUM จะได้รับดัชนีเชิงตัวเลขเริ่มจาก 1 ตามตำแหน่งในรายการ ตัวอย่างเช่น พิจารณาคอลัมน์ 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 ในคอลัมน์ ENUM, ค่าที่เป็น NULL สามารถถูกเก็บได้แม้ว่าจะไม่ได้อยู่ในรายการที่กำหนดไว้ล่วงหน้า. นอกจากนี้, หากมีการแทรกข้อมูลที่ไม่ถูกต้องและถูกแปลงเป็นสตริงว่าง, มันจะถูกเก็บด้วยดัชนี 0. พฤติกรรมนี้ทำให้สามารถตรวจจับข้อมูลที่ป้อนผิดได้.
5. ชุดอักขระและการจัดเรียงใน ENUM
วิธีการกำหนดชุดอักขระและการจัดเรียง
เช่นเดียวกับ CHAR และ VARCHAR, ชนิดข้อมูล ENUM อนุญาตให้คุณระบุชุดอักขระและการจัดเรียง. สิ่งนี้สำคัญเป็นพิเศษเมื่อสร้างระบบหลายภาษา หรือทำการค้นหาที่ขึ้นอยู่กับกฎการจัดเรียง. ตัวอย่างด้านล่าง:
CREATE TABLE documents (
id INT AUTO_INCREMENT PRIMARY KEY,
language ENUM('Japanese', 'English', 'Chinese') CHARACTER SET utf8 COLLATE utf8_general_ci
);
ในตัวอย่างนี้, มีการระบุชุดอักขระ UTF-8 และการจัดเรียงทั่วไป.
6. ความสามารถในการขยายและทางเลือกสำหรับ ENUM
กลยุทธ์สำหรับการขยาย ENUM
เนื่องจาก ENUM ขาดความยืดหยุ่นในการเก็บค่าที่กำหนดเอง, จึงไม่เหมาะสำหรับข้อมูลที่เปลี่ยนแปลงอย่างไดนามิก. วิธีหนึ่งคือการเพิ่มตัวเลือก “อื่น” และให้คอลัมน์ข้อความอิสระแยกต่างหาก:
ALTER TABLE products
MODIFY COLUMN category ENUM('Food', 'Clothing', 'Electronics', 'Furniture', 'Other') NOT NULL,
ADD COLUMN category_other VARCHAR(255) DEFAULT NULL;
ด้วยวิธีนี้, ค่าที่ไม่ได้อยู่ในรายการ ENUM สามารถเก็บในคอลัมน์ VARCHAR แยกต่างหาก, ทำให้สามารถจัดการแบบไดนามิกเมื่อจำเป็น.
การใช้ SET หรือ VARCHAR เป็นทางเลือก
เป็นทางเลือกสำหรับ ENUM, คุณอาจพิจารณาชนิดข้อมูล SET (ซึ่งอนุญาตให้เลือกหลายค่า) หรือชนิดข้อมูล VARCHAR ที่ยืดหยุ่นมากกว่า, ขึ้นอยู่กับความต้องการของแอปพลิเคชันของคุณ.


