Enum MySQL vs. conjunto

89

Para o tipo de dados MySQL de "enum" e "set", quais são as diferenças, vantagens e desvantagens de usar um em relação ao outro?

Tipo de dados de exemplo:

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

A única diferença que estou ciente é que ENUM permite que apenas um valor seja selecionado, enquanto SET permite que vários valores sejam selecionados.

tfont
fonte
5
Sem adv / disadv. Você deve escolher um deles de acordo com seus requisitos.
Ravnur
1
Os dois tipos não estão relacionados. Você também pode perguntar o que é melhor - int ou texto?
Boêmio

Respostas:

66

Conforme afirma a documentação do MySQL :

A definição de uma coluna ENUM ou SET age como uma restrição nos valores inseridos na coluna. Ocorre um erro para valores que não atendem a estas condições:

Um valor ENUM deve ser um dos listados na definição da coluna, ou seu equivalente numérico interno. O valor não pode ser o valor de erro (ou seja, 0 ou a string vazia). Para uma coluna definida como ENUM ('a', 'b', 'c'), valores como '', 'd' ou 'ax' são ilegais e rejeitados.

Um valor SET deve ser uma string vazia ou um valor que consiste apenas nos valores listados na definição da coluna separados por vírgulas. Para uma coluna definida como SET ('a', 'b', 'c'), valores como 'd' ou 'a, b, c, d' são ilegais e rejeitados.

user2001117
fonte
22
NOTA! Um valor de (a, b, c, d)não será rejeitado. Apenas o dserá rejeitado resultando no valor (a, b, c).
Itay Grudev,
3
Esta pode ser a documentação oficial, mas ainda é uma maneira muito confusa de descrevê-los. Com base em outras respostas, a diferença fica clara. SET é uma matriz de ENUM, onde cada valor consiste em 0 ou mais valores de estilo de enum.
Jonathon
9
Esta não é uma boa resposta. Foi solicitada uma explicação clara das diferenças e desvantagens / vantagens; a documentação oficial, da qual esta resposta é uma mera cópia, não o faz.
Smuuf
(a, b, c, d) será rejeitado se o modo estrito estiver
ativado
2
Esta não é a resposta.
Amit Shah
198

analogia:
ENUM = campos de rádio (apenas os valores aceitos são os listados, pode escolher apenas um)
SET = campos da caixa de seleção (apenas os valores aceitos são os listados, pode escolher vários)

Brad Kent
fonte
5
Limpo e fácil de entender!
Abu Shoeb de
Esta é a diferença correta que é descrita claramente. Obrigado @Brad Kent
Ravi Teja
44

Enum e Set dependem totalmente dos requisitos, como se você tiver uma lista de botões de opção onde apenas um pode ser escolhido por vez, use Enum. E se você tiver uma lista de caixas de seleção onde por vez mais de um item pode ser escolhido, use definir

Abhishek Singh
fonte
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');

Você pode copiar o código acima e colá-lo no mysql, e você descobrirá que SET na verdade é uma coleção. Você pode armazenar cada combinação de atributos declarada.

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

Você também pode copiar o código acima. E você descobrirá que cada ENUM, na verdade, só pode ser armazenado uma vez de cada vez. E você verá que os resultados das 2 últimas linhas estarão vazios.

Winbobob
fonte
9

Na verdade, é muito simples:

Quando você define um ENUM ('Sim', 'Não', 'Talvez'), então você deve INSERIR apenas um desses valores (ou seu número de índice posicional)

Quando você define um SET ('R', 'W', 'X'), então você pode INSERT uma string vazia, ou um ou mais desses valores. Se você inserir algo que não está no conjunto predefinido, uma string vazia será inserida. Observe que, antes de inserir, todos os valores duplicados são descartados, portanto, apenas uma instância de cada valor permitido está sendo inserida.

Espero que esteja entendido.

Observe que a resposta do Winbobob está incorreta e contém exemplos falhos, pois ao inserir vários valores, os valores devem ser strings, separados por vírgulas. Todas as suas inserções estão, na verdade, inserindo apenas um único valor (e os dois últimos não estão no conjunto definido)

Harly H.
fonte