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.
Respostas:
Conforme afirma a documentação do MySQL :
fonte
(a, b, c, d)
não será rejeitado. Apenas od
será rejeitado resultando no valor(a, b, c)
.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)
fonte
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
fonte
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.
fonte
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)
fonte