ทำความเข้าใจประเภทข้อมูล ENUM ใน MySQL: คู่มือครบถ้วนพร้อมตัวอย่าง

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

ข้อดี

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

ข้อเสีย

  1. ขาดความยืดหยุ่น ค่าของ ENUM ถูกกำหนดไว้คงที่ การเพิ่มตัวเลือกใหม่ต้องแก้ไขโครงสร้างตาราง ทำให้ ENUM ไม่เหมาะกับชุดข้อมูลที่เปลี่ยนแปลงบ่อย
  2. การจัดการข้อผิดพลาดที่ซับซ้อน หากมีการแทรกค่าที่ไม่ถูกต้อง 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 : ให้ความยืดหยุ่นสูงสุดโดยไม่มีข้อจำกัดที่กำหนดไว้ล่วงหน้า