Bóson Treinamentos em Ciência e Tecnologia

Tipo de dados ENUM no MySQL

Tipo de dado ENUM em MySQL

Tipo de dados ENUM no MySQL

O tipo de dados enum é um objeto string cujo valor é escolhido a partir de uma lista de valores permitidos, enumerados de forma explícita durante a especificação de uma coluna, quando uma tabela é criada.

É uma forma de se economizar espaço em disco, quando se sabe de antemão que a coluna só poderá armazenar um conjunto limitado de valores. Isso ocorre porque os valores são codificados internamente automaticamente como números, independente dos dados armazenados serem números, strings, etc.; assim, independente do tamanho do dado inserido na coluna, cada registro ocupará apenas um byte de espaço neste campo.

Tipo Tam. em Bytes Descrição
ENUM 1-2 Permite armazenar um valor selecionado de uma lista de valores aceitáveis.

Como criar uma coluna do tipo ENUM

Declaramos uma coluna do tipo enum ao criarmos uma tabela, passando os valores que serão armazenados entre parênteses, separados por vírgulas e individualmente envoltos entre aspas. Veja o exemplo:

CREATE TABLE camisas (
  idCamisa TINYINT PRIMARY KEY AUTO_INCREMENT,
  nome VARCHAR(25),
  tamanho ENUM('pequena','média','grande','extra-grande')
);

A coluna tamanho é uma enumeração que consiste nos quatro tamanhos possíveis para camisas a serem registradas na tabela.

Vamos inserir um registro nesta tabela, por exemplo, uma camisa regata tamanho grande:

INSERT INTO camisas (nome, tamanho)
VALUES ('regata', 'grande');

E então realizar uma consulta simples para verificar a inserção dos dados:

SELECT * FROM camisas;

Vamos tentar inserir agora um registro de uma camisa social, porém escrevendo o tamanho “large” (que não consta na lista de enumeração):

INSERT INTO camisas (nome, tamanho)
VALUES ('social', 'medium');

Agora ocorrerá um erro, pois o valor “medium” não consta na enumeração, e o registro não será inserido:

Alterando o valor inserido para “média” resolve o problema. Vamos aproveitar e inserir mais alguns registros:

INSERT INTO camisas (nome, tamanho)
VALUES
('social', 'média'),
('polo', 'pequena'),
('polo', 'grande'),
('camiseta', 'extra-grande');

Uma coluna do tipo enum pode ter no máximo 65.535 elementos atribuídos.

Podemos consultar os valores permissíveis para uma coluna do tipo enum com a declaração seguinte:

SHOW COLUMNS
FROM camisas
LIKE 'tamanho';

Além disso, podemos visualizar os números de índice dos valores enumerados armazenados consultando a coluna enum em um contexto numérico, como na seguinte declaração:

SELECT nome, tamanho+0
FROM camisas;

Note que há duas camisas com o mesmo número de índice associado (regata e polo) – isso ocorre porque ambas possuem o mesmo tamanho (grande, índice 3).

Problemas com o tipo ENUM

Um problema típico do tipo enum em MySQL é a aplicação da cláusula ORDER BY para tentar ordenar os resultados de uma consulta pela coluna deste tipo. A ordenação padrão mostra os elementos na ordem em que foram inseridos (ordem de seus índices), e não em ordem alfabética. Veja o exemplo:

SELECT * FROM camisas
ORDER BY tamanho;

Resultado:

Claramente o resultado não foi o que esperávamos. Porém, podemos consertar isso executando o ORDER BY combinado com CAST, da seguinte maneira:

SELECT * FROM camisas
ORDER BY CAST(tamanho AS CHAR);

Resultado:

Agora sim, resultado ordenado por tamanho em ordem alfabética.

Não e recomenda usar valores numéricos em uma coluna do tipo enum, pois neste caso não haverá economia de espaço de armazenamento (em relação a valores SMALLINT e TINYINT), além do risco de haver confusão entre o valor armazenado e o número empregado para representá-lo internamente.

Referências

Murach, J. Murach´s MySQL. 2ª Edição. Mike Murach & Associates. 2015

Próximo: Tipo de dados SET – Conjuntos em colunas no MySQL

 

Sair da versão mobile