MySQL enum vs. set


92

Untuk Data MySQL tipe "enum" dan "set" apa perbedaan dan keuntungan dan kerugian menggunakan satu versus yang lain?

Contoh tipe data:

  • enum ('A', 'B', 'C')
  • set ('A', 'B', 'C')

Satu-satunya perbedaan yang saya sadari adalah bahwa ENUM hanya mengizinkan satu nilai untuk dipilih, sedangkan SET memungkinkan beberapa nilai untuk dipilih.


5
Tidak ada adv / disadv. Anda harus memilih salah satunya tergantung pada kebutuhan Anda.
ravnur

1
Kedua jenis itu tidak berhubungan. Anda mungkin juga bertanya mana yang lebih baik - int atau teks?
Bohemian

Jawaban:


68

Seperti yang dinyatakan dalam dokumentasi MySQL :

Definisi kolom ENUM atau SET bertindak sebagai batasan pada nilai yang dimasukkan ke dalam kolom. Terjadi kesalahan untuk nilai yang tidak memenuhi kondisi berikut:

Nilai ENUM harus salah satu yang tercantum dalam definisi kolom, atau angka internal yang setara dengannya. Nilai tidak boleh nilai kesalahan (yaitu, 0 atau string kosong). Untuk kolom yang didefinisikan sebagai ENUM ('a', 'b', 'c'), nilai seperti '', 'd', atau 'ax' adalah ilegal dan ditolak.

Nilai SET harus berupa string kosong atau nilai yang hanya terdiri dari nilai yang tercantum dalam definisi kolom yang dipisahkan dengan koma. Untuk kolom yang didefinisikan sebagai SET ('a', 'b', 'c'), nilai seperti 'd' atau 'a, b, c, d' ilegal dan ditolak.


22
CATATAN! Nilai (a, b, c, d)tidak akan ditolak. Hanya dkemauan yang ditolak sehingga menghasilkan nilai (a, b, c).
Itay Grudev

3
Ini mungkin dokumentasi resmi, tetapi masih sangat membingungkan untuk menjelaskannya. Berdasarkan jawaban lain, perbedaannya menjadi jelas. SET adalah larik ENUM, di mana setiap nilai terdiri dari 0 atau lebih nilai gaya enum.
Jonathon

10
Ini bukan jawaban yang bagus. Penjelasan yang jelas tentang perbedaan dan kekurangan / keuntungan diminta; dokumentasi resmi, yang jawabannya hanya salinannya, gagal melakukannya.
Smuuf

(a, b, c, d) akan ditolak jika mode Ketat aktif
Chinmay

2
Ini bukanlah jawabannya.
Amit Shah

204

analogi:
ENUM = bidang radio (hanya nilai yang diterima yang terdaftar, hanya boleh memilih satu)
SET = bidang kotak centang (hanya nilai yang diterima yang terdaftar, dapat memilih beberapa)


5
Bersih dan mudah dimengerti!
Abu Shoeb

Inilah perbedaan yang benar yang dijelaskan dengan jelas. Terima kasih @Brad Kent
Ravi Teja

44

Enum dan Set sepenuhnya bergantung pada kebutuhan, seperti jika Anda memiliki daftar tombol radio di mana hanya satu yang dapat dipilih dalam satu waktu, gunakan Enum. Dan jika Anda memiliki daftar kotak centang di mana pada satu waktu lebih dari satu item dapat dipilih, gunakan set.


22
CREATE TABLE setTest(
  attrib SET('bold','italic','underline')
);

INSERT INTO setTest (attrib) VALUES ('bold');
INSERT INTO setTest (attrib) VALUES ('bold,italic');
INSERT INTO setTest (attrib) VALUES ('bold,italic,underline');

Anda dapat menyalin kode di atas dan menempelkannya di mysql, dan Anda akan menemukan bahwa SET sebenarnya adalah sebuah koleksi. Anda dapat menyimpan setiap gabungan atribut yang Anda deklarasikan.

CREATE TABLE enumTest(
 color ENUM('red','green','blue')
);

INSERT INTO enumTest (color) VALUES ('red');
INSERT INTO enumTest (color) VALUES ('gray');
INSERT INTO enumTest (color) VALUES ('red,green');

Anda juga dapat menyalin kode di atas. Dan Anda akan menemukan bahwa setiap ENUM sebenarnya hanya dapat disimpan sekali setiap saat. Dan Anda akan menemukan bahwa hasil dari 2 baris terakhir akan kosong.


9

Sebenarnya ini cukup sederhana:

Saat Anda menentukan ENUM ('Ya', 'Tidak', 'Mungkin'), Anda harus MENYISIPKAN hanya satu dari nilai-nilai ini (atau nomor indeks posisinya)

Ketika Anda mendefinisikan SET ('R', 'W', 'X') maka Anda dapat MEMASUKKAN string kosong, atau satu atau lebih dari nilai-nilai ini. Jika Anda memasukkan sesuatu yang tidak ada di set standar, string kosong akan disisipkan. Perhatikan bahwa sebelum memasukkan semua nilai duplikat akan dibuang, jadi hanya satu contoh dari setiap nilai yang diizinkan yang dimasukkan.

Semoga ini menyelesaikannya.

Harap dicatat bahwa jawaban Winbobob salah dan berisi contoh yang salah, seperti saat memasukkan beberapa nilai, nilainya harus berupa string, dipisahkan dengan koma. Semua sisipannya sebenarnya hanya memasukkan satu nilai (dan dua yang terakhir tidak ada dalam set yang ditentukan)


0

ENUM -> pilih hanya satu dari nilai yang tersedia untuk disisipkan.

(no_null, no_any_duplicate)


SET -> pilih kombinasi atau nilai tunggal seperti satu set dan masukkan ke dalamnya.

(null, individual_values, all_the_available_values_together)

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.