Entendendo o Tipo de Dados ENUM no MySQL: Guia Completo com Exemplos

1. Visão Geral do Tipo ENUM

O Que É o Tipo ENUM?

O tipo ENUM (enumeração) no MySQL é um tipo de dados que armazena exatamente um valor de uma lista predefinida. Como apenas strings específicas predefinidas podem ser salvas na coluna, isso garante a consistência dos dados e impede a inserção de valores inválidos.

Por exemplo, quando um usuário escolhe uma opção de escolhas limitadas, como gênero ou categoria de produto, o uso do tipo ENUM elimina a lógica desnecessária de verificação de erros. O seguinte é um exemplo de criação de uma tabela contendo uma coluna ENUM:

CREATE TABLE products (
    id INT AUTO_INCREMENT PRIMARY KEY,
    category ENUM('食品', '衣料品', '家電', '家具') NOT NULL
);

Neste exemplo, a coluna category pode armazenar apenas um dos seguintes valores: “食品”, “衣料品”, “家電”, ou “家具”. Isso ajuda a simplificar o gerenciamento de dados e reduz o risco de entrada incorreta.

Principais Casos de Uso do ENUM

O tipo ENUM é comumente usado em cenários como:

  • Gerenciamento de status : Rastreamento de etapas de fluxo de trabalho, como “未開始”, “進行中”, ou “完了”.
  • Definição de categorias : Gerenciamento de opções predefinidas, como categorias de produtos, tipos de usuários ou posições de emprego.
  • Agrupamento de classificações ou níveis : Níveis de dificuldade de jogos (“初級”, “中級”, “上級”) ou classificações de produtos (“良い”, “普通”, “悪い”).

2. Vantagens e Desvantagens do ENUM

Vantagens

  1. Melhoria na consistência dos dados O ENUM permite apenas valores incluídos em sua lista predefinida, permitindo o manuseio consistente de dados. Por exemplo, ao gerenciar gênero, apenas valores definidos como “男性” ou “女性” são permitidos, impedindo entradas inválidas.
  2. Uso eficiente de armazenamento Cada valor ENUM é armazenado internamente como um índice inteiro. Como resultado, ele consome menos armazenamento em comparação com VARCHAR. Por exemplo, valores como ‘small’ ou ‘large’ consomem mais espaço como VARCHAR, mas o ENUM os armazena de forma eficiente usando índices numéricos.

Desvantagens

  1. Falta de flexibilidade Os valores ENUM são fixos. Adicionar novas opções requer a alteração da estrutura da tabela, tornando o ENUM inadequado para conjuntos de dados que mudam frequentemente.
  2. Manuseio complexo de erros Se um valor inválido for inserido, o MySQL pode gerar um erro ou armazenar uma string vazia. Isso pode complicar a depuração para os desenvolvedores.

3. Configuração do ENUM e Uso Prático

Configuração Básica e Manuseio de Erros

Para configurar um tipo ENUM, basta definir a lista de strings válidas. O exemplo a seguir define uma coluna ENUM em uma tabela:

CREATE TABLE shirts (
    id INT AUTO_INCREMENT PRIMARY KEY,
    size ENUM('XS', 'S', 'M', 'L', 'XL') NOT NULL
);

Aqui, a coluna size aceita apenas “XS”, “S”, “M”, “L” ou “XL”. Tentar inserir um valor não presente na lista (por exemplo, ‘XXL’) resulta em um erro Data truncated. Isso impede dados inválidos e mantém a consistência.

Exemplo de Uso Prático

O exemplo a seguir usa ENUM para gerenciar papéis de usuário, como “管理者”, “一般ユーザー” e “ゲスト”:

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    role ENUM('管理者', '一般ユーザー', 'ゲスト') NOT NULL
);

Usar uma coluna ENUM facilita a manutenção de permissões consistentes e controle baseado em papéis.

4. Indexação e Manuseio de NULL com ENUM

Uso de Índices

Os valores ENUM são atribuídos a índices inteiros com base em sua posição na lista. Por exemplo:

CREATE TABLE products (
    id INT AUTO_INCREMENT PRIMARY KEY,
    size ENUM('S', 'M', 'L', 'XL')
);

“S” tem índice 1, “M” índice 2, e assim por diante. Esses índices podem ser usados em cláusulas WHERE:

SELECT * FROM products WHERE size = 2;

Essa consulta recupera registros onde o tamanho corresponde a “M”.

Manuseio de NULL e Strings Vazias

Se NULL for permitido, a coluna pode armazenar NULL como um estado válido, mesmo que não esteja na lista ENUM. Além disso, dados inválidos inseridos como uma string vazia são armazenados com índice 0, facilitando a detecção de entradas incorretas.

5. Conjuntos de Caracteres e Colações para ENUM

Como Definir Conjuntos de Caracteres e Colações

ENUM, assim como CHAR ou VARCHAR, suporta definições de conjunto de caracteres e collation. Isso é importante ao lidar com dados multilíngues ou operações de ordenação. Exemplo:

CREATE TABLE documents (
    id INT AUTO_INCREMENT PRIMARY KEY,
    language ENUM('日本語', '英語', '中国語') 
        CHARACTER SET utf8 
        COLLATE utf8_general_ci
);

Este exemplo especifica UTF-8 e uma collation de uso geral.

6. Expandindo ENUM e Alternativas

Técnicas para Expandir ENUM

Como o ENUM carece de flexibilidade para valores dinâmicos, você pode incluir uma opção “Outro” e armazenar a entrada livre em uma coluna separada:

ALTER TABLE products 
MODIFY COLUMN category ENUM('食品', '衣料品', '家電', '家具', 'その他') NOT NULL,
ADD COLUMN category_other VARCHAR(255) DEFAULT NULL;

Isso permite armazenar valores não incluídos na lista ENUM enquanto mantém a estrutura.

Tipos de Dados Alternativos: SET ou VARCHAR

Dependendo dos requisitos, as alternativas incluem:

  • Tipo SET : Armazena múltiplas seleções de uma lista.
  • VARCHAR : Oferece máxima flexibilidade sem restrições pré-definidas.