Panduan MySQL ENUM: Cara Pakai, Keuntungan, dan Tips

1. Ringkasan Tipe ENUM

Apa itu tipe ENUM

Tipe ENUM MySQL (enumerasi) adalah tipe data yang menyimpan satu nilai saja dari daftar yang telah didefinisikan sebelumnya. Karena hanya string tertentu yang ditentukan dalam daftar yang dapat disimpan di kolom, tipe ini dapat menjaga konsistensi data dan berfungsi mencegah input data yang tidak valid. Misalnya, ketika pengguna memilih satu opsi dari pilihan terbatas seperti jenis kelamin atau kategori produk, penggunaan tipe ENUM dapat menghilangkan kebutuhan pemeriksaan error yang tidak perlu. Berikut adalah contoh pembuatan tabel yang mencakup kolom tipe ENUM:
CREATE TABLE products (
    id INT AUTO_INCREMENT PRIMARY KEY,
    category ENUM('makanan', 'pakaian', 'elektronik rumah', 'perabot') NOT NULL
);
Dalam contoh ini, kolom “category” dapat menyimpan hanya satu dari empat nilai “makanan”,”pakaian”,”elektronik rumah”,”perabot”. Hal ini memudahkan pengelolaan data dan mengurangi risiko input yang salah.

Penggunaan utama tipe ENUM

Tipe ENUM biasanya digunakan untuk hal-hal berikut:
  • Manajemen status: untuk mengelola status kemajuan proyek dengan mencantumkan status seperti “belum dimulai” (belum dimulai), “sedang berlangsung” (sedang berlangsung), “selesai” (selesai).
  • Pemilahan kategori: digunakan saat mengelola pilihan kategori yang telah didefinisikan sebelumnya seperti produk, tipe pengguna, jabatan, dll.
  • Peringkat: seperti tingkat kesulitan game (“pemula” (pemula), “menengah” (menengah), “lanjutan” (lanjutan)) atau penilaian produk (“baik” (baik), “biasa” (biasa), “buruk” (buruk)).

2. Keuntungan dan Kerugian Tipe ENUM

Keuntungan

  1. Peningkatan Konsistensi Data Dengan tipe ENUM, hanya nilai yang termasuk dalam daftar yang ditentukan yang dapat disimpan, sehingga data menjadi konsisten dan lebih mudah dikelola. Misalnya, ketika mengelola jenis kelamin, hanya nilai tertentu seperti “Laki-laki” atau “Perempuan” yang diizinkan, sehingga input yang salah dapat dicegah.
  2. Efisiensi Penyimpanan Tipe ENUM memberikan indeks integer untuk setiap nilai dalam daftar, sehingga sebenarnya disimpan sebagai integer, yang menghemat ruang penyimpanan dibandingkan tipe VARCHAR. Misalnya, menyimpan informasi ukuran seperti ‘small’ atau ‘large’ dalam VARCHAR akan mengonsumsi lebih banyak ruang, tetapi dengan mendefinisikannya sebagai ENUM memungkinkan penyimpanan yang lebih efisien.

Kerugian

  1. Kurangnya Fleksibilitas Karena tipe ENUM hanya dapat menggunakan pilihan yang sudah ditetapkan, menambahkan nilai baru memerlukan perubahan struktur tabel. Oleh karena itu, tidak cocok untuk kasus di mana pilihan dapat bertambah secara dinamis.
  2. Kesulitan Penanganan Error Jika nilai yang tidak valid dimasukkan, dapat menyebabkan error atau menyimpan string kosong. Hal ini dapat membuat proses debugging menjadi lebih rumit bagi pengembang.

3. Pengaturan dan Contoh Penggunaan Tipe ENUM

Pengaturan Dasar dan Penanganan Error

Pengaturan tipe ENUM hanya memerlukan penentuan string yang dapat disimpan dalam daftar. Berikut adalah contoh mendefinisikan kolom tipe ENUM pada tabel:
CREATE TABLE shirts (
    id INT AUTO_INCREMENT PRIMARY KEY,
    size ENUM('XS', 'S', 'M', 'L', 'XL') NOT NULL
);
Dalam kasus ini, kolom “size” hanya dapat menyimpan satu nilai dari 5 nilai “XS”, “S”, “M”, “L”, “XL”. Jika mencoba memasukkan nilai yang tidak ada dalam daftar (misalnya ’XXL’), akan muncul error Data truncated. Hal ini mencegah penyimpanan nilai yang tidak termasuk dalam daftar, sehingga menjaga konsistensi data.

Contoh Penggunaan Nyata

Selanjutnya, contoh penggunaan tipe ENUM untuk mengelola peran pengguna (“Administrator”, “Pengguna Biasa”, “Tamu”)。
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    role ENUM('Administrator', 'Pengguna Biasa', 'Tamu') NOT NULL
);
Jika ingin memberikan hak akses operasi yang berbeda berdasarkan peran, menggunakan kolom tipe ENUM memudahkan menjaga konsistensi data.

4. Penanganan Indeks Tipe ENUM dan NULL

Penggunaan Indeks

Nilai tipe ENUM diberikan indeks mulai dari 1 sesuai urutan dalam daftar. Misalnya, jika ada kolom ENUM yang menyimpan informasi ukuran seperti berikut:
CREATE TABLE products (
    id INT AUTO_INCREMENT PRIMARY KEY,
    size ENUM('S', 'M', 'L', 'XL')
);
“S” memiliki indeks 1, “M” memiliki indeks 2… dan seterusnya. Indeks ini juga dapat digunakan dalam kondisi klausa WHERE, memungkinkan operasi data yang efisien.
SELECT * FROM products WHERE size = 2;
Kueri ini mengambil baris dengan ukuran “M”.

Penanganan NULL dan String Kosong

Jika kolom tipe ENUM mengizinkan NULL, nilai NULL dapat disimpan bahkan jika tidak termasuk dalam daftar. Selain itu, ketika string kosong dimasukkan sebagai data error, itu disimpan sebagai indeks 0, sehingga kesalahan input dapat diidentifikasi.

5. Set karakter dan urutan kolasi tipe ENUM

Cara mengatur set karakter dan urutan kolasi

Tipe ENUM dapat menentukan set karakter dan urutan kolasi seperti CHAR dan VARCHAR. Ini penting terutama ketika mendukung banyak bahasa atau melakukan pencarian yang mempertimbangkan urutan kolasi. Berikut contohnya:
CREATE TABLE documents    id INT AUTO_INCREMENT PRIMARY KEY,
    language ENUM('Jepang', 'Inggris', 'Cina') CHARACTER SET utf8 COLLATE utf8_general_ci
);
Dalam contoh ini, set karakter UTF-8 dan urutan kolasi umum telah ditentukan.

6. Skalabilitas tipe ENUM dan alternatif

Strategi untuk memperluas

Tipe ENUM kurang fleksibel dalam menyimpan nilai bebas pada kolom, sehingga tidak cocok untuk data yang berubah secara dinamis. Dalam kasus ini, dapat menambahkan opsi “Lainnya” dan membuat kolom input bebas terpisah:
ALTER TABLE products 
MODIFY COLUMN category ENUM('Makanan', 'Pakaian', 'Elektronik', 'Furnitur', 'Lainnya') NOT NULL,
ADD COLUMN category_other VARCHAR(255) DEFAULT NULL;
Dengan cara ini, item yang tidak ada dalam tipe ENUM disimpan di kolom VARCHAR terpisah, sehingga dapat menangani perubahan secara dinamis.

SET dan sebagai tipe data alternatif

Sebagai alternatif ENUM, mempertimbangkan tipe SET yang dapat menyimpan banyak pilihan, atau tipe VARCHAR yang lebih fleksibel, juga merupakan pilihan yang baik.