فهم نوع البيانات ENUM في MySQL: دليل شامل مع أمثلة

1. نظرة عامة على نوع ENUM

ما هو نوع ENUM؟

نوع ENUM (التعداد) في 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، يدعم تعريفات مجموعة الأحرف والفرز. هذا مهم عند التعامل مع بيانات متعددة اللغات أو عمليات الفرز. مثال:

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 : يخزن اختيارات متعددة من قائمة.
  • VARCHAR : يوفر أقصى مرونة دون قيود مسبقة.