Enumerazione MySQL e set


92

Per i tipi di dati MySQL "enum" e "set" quali sono le differenze, i vantaggi e gli svantaggi dell'utilizzo dell'uno rispetto all'altro?

Tipo di dati di esempio:

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

L'unica differenza di cui sono a conoscenza è che ENUM consente di selezionare solo un valore rispetto a SET consente di selezionare più valori.


5
No adv / disadv. Dovresti sceglierne uno in base alle tue esigenze.
ravnur

1
I due tipi non sono correlati. Potresti anche chiedere qual è il migliore: int o text?
Bohemian

Risposte:


68

Come afferma la documentazione di MySQL :

La definizione di una colonna ENUM o SET agisce come un vincolo sui valori immessi nella colonna. Si verifica un errore per i valori che non soddisfano queste condizioni:

Un valore ENUM deve essere uno di quelli elencati nella definizione della colonna o l'equivalente numerico interno della stessa. Il valore non può essere il valore di errore (ovvero 0 o la stringa vuota). Per una colonna definita come ENUM ("a", "b", "c"), valori come "", "d" o "ax" non sono validi e vengono rifiutati.

Un valore SET deve essere una stringa vuota o un valore costituito solo dai valori elencati nella definizione di colonna separati da virgole. Per una colonna definita come SET ('a', 'b', 'c'), valori come 'd' o 'a, b, c, d' sono illegali e vengono rifiutati.


22
NOTA! Un valore di (a, b, c, d)non verrà rifiutato. Solo il dverrà rifiutato con conseguente valore (a, b, c).
Itay Grudev

3
Questa potrebbe essere la documentazione ufficiale, ma è ancora un modo molto confuso per descriverli. Sulla base di altre risposte la differenza diventa chiara. SET è un array di ENUM, dove ogni valore è costituito da 0 o più valori di stile enum.
Jonathon

10
Questa non è una buona risposta. È stata richiesta una chiara spiegazione delle differenze e dei dis / vantaggi; la documentazione ufficiale, di cui questa risposta è una semplice copia, non riesce a farlo.
Smuuf

(a, b, c, d) sarà rifiutato se la modalità rigorosa è attiva
Chinmay

2
Questa non è la risposta.
Amit Shah

204

analogia:
ENUM = campi radio (solo i valori accettati sono quelli elencati, può sceglierne solo uno)
SET = campi casella di controllo (solo i valori accettati sono quelli elencati, può scegliere più)


5
Pulito e facile da capire!
Abu Shoeb

Questa è la differenza corretta che è descritta chiaramente. Grazie @Brad Kent
Ravi Teja

44

Enum e Set dipendono totalmente dai requisiti, ad esempio se si dispone di un elenco di pulsanti di opzione in cui è possibile sceglierne solo uno alla volta, utilizzare Enum. E se hai un elenco di caselle di controllo in cui è possibile scegliere più di un elemento alla volta, usa 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');

Puoi copiare il codice sopra e incollarlo in mysql e scoprirai che SET in realtà è una raccolta. È possibile memorizzare ogni combinazione di attributi dichiarata.

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');

Puoi anche copiare il codice sopra. E scoprirai che ogni ENUM in realtà può essere memorizzato solo una volta alla volta. E scoprirai che i risultati delle ultime 2 righe saranno entrambi vuoti.


9

In realtà è piuttosto semplice:

Quando si definisce un ENUM ("Sì", "No", "Forse"), è necessario INSERIRE solo uno di questi valori (o il loro numero di indice di posizione)

Quando si definisce un SET ('R', 'W', 'X'), è possibile INSERIRE una stringa vuota, oppure uno o più di questi valori. Se inserisci qualcosa che non è nel set predefinito, viene invece inserita una stringa vuota. Si noti che prima di inserire tutti i valori duplicati vengono scartati, quindi viene inserita solo un'istanza di ogni valore consentito.

Spero che questo chiarisca tutto.

Si noti che la risposta di Winbobob non è corretta e contiene esempi errati, poiché quando si inseriscono più valori, i valori devono essere stringhe, separati da virgole. Tutti i suoi inserti stanno effettivamente inserendo un solo valore (e gli ultimi due non sono nel set definito)


0

ENUM -> scegli solo uno dei valori disponibili da inserire.

(no_null, no_any_duplicate)


SET -> scegli qualsiasi combinazione o valore singolo come un set e inseriscili in.

(null, valori_individuali, all_the_available_values_together)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.