คู่มือเต็มของ MySQL ENUM: วิธีใช้, ข้อดี, ข้อควรระวัง

1. ภาพรวมของประเภท ENUM

ENUM คือ

ประเภท ENUM ของ MySQL เป็นประเภทข้อมูลที่เก็บค่าเพียงหนึ่งค่าเท่านั้นจากรายการที่กำหนดไว้ล่วงหน้า เนื่องจากคอลัมน์สามารถบันทึกได้เฉพาะสตริงที่ระบุในรายการเท่านั้น จึงช่วยรักษาความสอดคล้องของข้อมูลและป้องกันการป้อนข้อมูลที่ไม่ถูกต้อง ประเภท ENUM (enumeration) ของ MySQL เป็นประเภทข้อมูลที่เก็บค่าเพียงหนึ่งค่าเท่านั้นจากรายการที่กำหนดไว้ล่วงหน้า เนื่องจากคอลัมน์สามารถบันทึกได้เฉพาะสตริงที่ระบุในรายการเท่านั้น จึงช่วยรักษาความสอดคล้องของข้อมูลและป้องกันการป้อนข้อมูลที่ไม่ถูกต้อง ตัวอย่างเช่น หากผู้ใช้ต้องเลือกหนึ่งตัวเลือกจากตัวเลือกที่จำกัด เช่น เพศหรือหมวดหมู่สินค้า การใช้ประเภท ENUM จะช่วยลดการตรวจสอบข้อผิดพลาดที่ไม่จำเป็น ตัวอย่างต่อไปนี้เป็นการสร้างตารางที่มีคอลัมน์ประเภท ENUM:
CREATE TABLE products (
    id INT AUTO_INCREMENT PRIMARY KEY,
    category ENUM('อาหาร', 'เสื้อผ้า', 'เครื่องใช้ไฟฟ้า', 'เฟอร์นิเจอร์') NOT NULL
);
ในตัวอย่างนี้ คอลัมน์ “category” สามารถเก็บค่าได้เพียงหนึ่งค่าในสี่ค่าที่กำหนดคือ “อาหาร” “เสื้อผ้า” “เครื่องใช้ไฟฟ้า” “เฟอร์นิเจอร์” ซึ่งทำให้การจัดการข้อมูลง่ายขึ้นและลดความเสี่ยงจากการป้อนข้อมูลผิดพลาด

การใช้งานหลักของ ENUM

ENUM ถูกใช้หลัก ๆ ในกรณีต่อไปนี้:
  • การจัดการสถานะ:เพื่อจัดการสถานะความคืบหน้าของโครงการ เช่น “ยังไม่เริ่ม” “กำลังดำเนินการ” “เสร็จสิ้น” เป็นต้น
  • การจัดประเภท:ใช้เมื่อจัดการตัวเลือกของหมวดหมู่ที่กำหนดไว้ล่วงหน้า เช่น สินค้า, ประเภทผู้ใช้, ตำแหน่ง ฯลฯ, ใช้เมื่อจัดการตัวเลือกของหมวดหมู่ที่กำหนดไว้ล่วงหน้า
  • การจัดอันดับ:เช่น ความยากของเกม (“ระดับต้น” “ระดับกลาง” “ระดับสูง”) หรือการประเมินสินค้ (“ดี” “ปกติ” “แย่”) เป็นต้น

2. ข้อดีและข้อเสียของประเภท ENUM

ข้อดี

  1. การปรับปรุงความสอดคล้องของข้อมูล เนื่องจากประเภท ENUM สามารถเก็บค่าได้เฉพาะค่าที่อยู่ในรายการที่กำหนดเท่านั้น ทำให้ข้อมูลมีความสอดคล้องและง่ายต่อการจัดการ ตัวอย่างเช่น หากจัดการเพศ จะอนุญาตให้ใช้ค่าเฉพาะเช่น “ชาย” หรือหญิง” เท่านั้น ซึ่งช่วยป้องกันการป้อนข้อมูลที่ผิดพลาด
  2. การเพิ่มประสิทธิภาพการจัดเก็บ เนื่องจากประเภท ENUM จะกำหนดดัชนีจำนวนเต็มให้กับแต่ละค่าภายในรายการ ดังนั้นค่าจะถูกเก็บเป็นจำนวนเต็มจริง ๆ ทำให้ประหยัดพื้นที่จัดเก็บเมื่อเทียบกับประเภท VARCHAR ตัวอย่างเช่น หากบันทึกข้อมูลขนาดเช่น ‘small’ หรือ ‘large’ ด้วย VARCHAR จะใช้พื้นที่มากขึ้น แต่การกำหนดด้วย ENUM ทำให้การจัดเก็บมีประสิทธิภาพมากขึ้น

ข้อเสีย

  1. การขาดความยืดหยุ่น เนื่องจากประเภท ENUM สามารถใช้ตัวเลือกที่กำหนดไว้เท่านั้น การเพิ่มค่าที่ใหม่จำเป็นต้องเปลี่ยนโครงสร้างตาราง ดังนั้นจึงไม่เหมาะกับกรณีที่ตัวเลือกเพิ่มขึ้นอย่างไดนามิก
  2. ความยากในการจัดการข้อผิดพลาด หากมีการแทรกค่าที่ไม่ถูกต้องอาจทำให้เกิดข้อผิดพลาดหรือบันทึกเป็นสตริงว่าง ซึ่งอาจทำให้การดีบักของนักพัฒนาซับซ้อนขึ้น

3. การตั้งค่าและตัวอย่างการใช้ ENUM type

การตั้งค่าพื้นฐานและการจัดการข้อผิดพลาด

ENUM เพียงระบุสตริงที่สามารถเก็บในรายการได้เท่านั้น ตัวอย่างต่อไปนี้เป็นการกำหนดคอลัมน์ประเภท ENUM ในตาราง:
CREATE TABLE shirts (
    id INT AUTO_INCREMENT PRIMARY KEY,
    size ENUM('XS', 'S', 'M', 'L', 'XL') NOT NULL
);
ในกรณีนี้ คอลัมน์ “size” สามารถบันทึกค่าได้เพียงหนึ่งค่าจาก 5 ค่าที่เป็น “XS”,”S”,”M”,”L”,”XL” เท่านั้น หากพยายามแทรกค่าที่ไม่อยู่ในรายการ (เช่น ’XXL’) จะเกิดข้อผิดพลาด Data truncated ซึ่งช่วยป้องกันการเก็บค่าที่ไม่อยู่ในรายการและรักษาความสอดคล้องของข้อมูล.

ตัวอย่างการใช้งานจริง

ต่อไปนี้เป็นตัวอย่างการใช้ ENUM เพื่อจัดการตำแหน่งของผู้ใช้ (“ผู้ดูแลระบบ”,”ผู้ใช้ทั่วไป”,”ผู้เยี่ยมชม”).
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    role ENUM('ผู้ดูแลระบบ', 'ผู้ใช้ทั่วไป', 'ผู้เยี่ยมชม') 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 และสตริงว่าง

หากอนุญาตให้คอลัมน์ประเภท ENUM มีค่า NULL จะสามารถเก็บค่า NULL ได้แม้จะไม่อยู่ในรายการ นอกจากนี้ หากมีการแทรกสตริงว่างเป็นข้อมูลผิดพลาด จะถูกเก็บเป็นดัชนี 0 ทำให้สามารถระบุการป้อนข้อมูลที่ผิดพลาดได้

5. ชุดอักขระและการจัดเรียงของ ENUM

วิธีตั้งค่าชุดอักขระและการจัดเรียง

ชนิด ENUM สามารถระบุชุดอักขระและการจัดเรียงได้เช่นเดียวกับ CHAR หรือ VARCHAR. โดยเฉพาะอย่างยิ่งเมื่อรองรับหลายภาษา หรือทำการค้นหาที่คำนึงถึงการจัดเรียงจึงมีความสำคัญ. ตัวอย่างต่อไปนี้:
CREATE TABLE documents (
    id INT AUTO_INCREMENT PRIMARY KEY,
    language ENUM('ญี่ปุ่น', 'อังกฤษ', 'จีน') CHARACTER SET utf8 COLLATE utf8_general_ci
);
ในตัวอย่างนี้ได้ระบุชุดอักขระ UTF-8 และการจัดเรียงทั่วไป.

6. ความสามารถในการขยายของประเภท ENUM และทางเลือก

แนวคิดสำหรับการขยาย

ประเภท ENUM ขาดความยืดหยุ่นในการเก็บค่าที่อิสระในคอลัมน์ ทำให้ไม่เหมาะกับข้อมูลที่เปลี่ยนแปลงแบบไดนามิก ในกรณีนี้สามารถเพิ่มตัวเลือก “อื่นๆ” และสร้างคอลัมน์การป้อนข้อมูลอิสระแยกต่างหากได้:
ALTER TABLE products 
MODIFY COLUMN category ENUM('อาหาร', 'เสื้อผ้า', 'เครื่องใช้ไฟฟ้า', 'เฟอร์นิเจอร์', 'อื่นๆ') NOT NULL,
ADD COLUMN category_other VARCHAR(255) DEFAULT NULL;
ด้วยวิธีนี้ เราจะเก็บรายการที่ไม่มีในประเภท ENUM ลงในคอลัมน์ VARCHAR แยกต่างหาก เพื่อให้สามารถรองรับการเปลี่ยนแปลงแบบไดนามิกได้

SET หรือ VARCHAR เป็นประเภทข้อมูลทางเลือก

เป็นอีกทางเลือกหนึ่งที่ควรพิจารณาในการทดแทนประเภท ENUM ด้วยประเภท SET ที่สามารถเก็บตัวเลือกหลายค่าได้ หรือประเภท VARCHAR ที่ยืดหยุ่นมากขึ้น