ZEROFILL e UNSIGNED em MySQL - Uma Explicação Prática

Em vários anos trabalhando com MySQL, por muito tempo não reparei nos atributos ZEROFILL e UNSIGNED do MySQL, até que precisei usar o ZEROFILL para uma aplicação.

O que são estes atributos? UNSIGNED e é um atributo opcional para inteiros no MySQL usado para definir apenas números positivos. ZEROFILL serve para preencher com zeros um inteiro de forma que todos os números da coluna tenham o mesmo número de caracteres.

Dado o que eles são, é mais fácil memorizar tendo em mente que unsigned em inglês significa "sem sinal", ou seja, sem o sinal de menos (-), portanto armazena somente numeros positivos. Já zero fill em inglês significa "preencher com zeros", mais especificamente preencher à esquerda neste caso.

Por que utilizar UNSIGNED

Muitos desenvolvedores não se interessam por ajustar atributos como este, já que mesmo se estiverem errados, na maioria das vezes não quebram a aplicação.

Mas de qualquer forma, há sempre o jeito certo de seguir, e neste caso o jeito mais otimizado vai nos dar mais consistência em nosso banco de dados e poupar espaço para um volume de dados maior.

Utilize sempre UNSIGNED para representar valores inteiros que nunca serão negativos. Por exemplo, um id AUTO_INCREMENT que começa no 1 jamais será negativo.

A principal vantagem de se utilizar esse atributo é que o MySQL não vai alocar espaço desnecessário para números negativos de -2147483648 até 0, e vai dobrar o espaço para números positivos, de 0 até 4294967295. Fonte: MySQL.

Por que utilizar ZEROFILL

A função do atributo ZEROFILL é apenas indicar ao MySQL como a informação deve ser mostrada. Ela não afeta como os dados são armazenados.

Se você precisar fazer um WHERE 0001=1, o SQL vai funcionar normalmente como antes.

Portanto, com fins apenas estéticos, você pode usar este atributo para ter sempre uma consistência no tamanho dos inteiros da sua aplicação. Nada que não possa ser resolvido no frontend na minha opinião, mas se você quer manter a visualização das colunas com dados no formato 00010, 00011, 00012, etc. é valido usar este atributo.

Quantidade de zeros com ZEROFILL

Para especificar quantos zeros à esquerda você quer mostrar, você precisa especificar o tamanho da coluna na hora de criar ou alterar uma tabela, exemplo: INT(5). Veja nos próximos parágrafos como criar ou modificar uma tabela.

Se um número for maior que 5, o número não será cortado, mas será mostrado normalmente com 6 digitos ou mais. E se for menor, ele será preenchido com zeros.

Esse comportamento de INT(5) é só para fins de visualização pois um inteiro tem sempre o mesmo tamanho, mas entendo que é totalmente diferente de um VARCHAR(5), onde a string é cortada e isso é confuso no MySQL. ?

Modificando uma tabela existente

Para modificar os atributos UNSIGNED ou ZEROFILL em uma tabela já criada, utilize a sintaxe ALTER TABLE:

ALTER TABLE tabela MODIFY COLUMN numero INT { NOT NULL | UNSIGNED | ZEROFILL | DEFAULT };

UNSIGNED

Por exemplo, o comando abaixo vai modificar a tabela e a coluna numero para UNSIGNED. Mantendo os dados se a coluna já era do tipo INT.

Obs: Você precisa modificar também DEFAULT, NOT_NULL, e AUTO_INCREMENT se for o caso. Se você não especificar estes atributos eles serão modificados para o padrão do MySQL. Considere testar em uma tabela de testes antes.

Obs 2: Qualquer número negativo dentro desta coluna será convertido em 0 portanto use com cautela.

ALTER TABLE tabela MODIFY numero INT UNSIGNED NOT NULL;

ZEROFILL

Como dito anteriormente, quando uma coluna tem ZEROFILL ela automaticamente tem UNSIGNED também ativado.

Note que a única diferença do exemplo para modificar para unsigned é que usei o size/length no INT, com largura de 5 dígitos. Isso não significa que você vai poder inserir números até 5 dígitos ou vai perder dados superiores à 99999, mas significa apenas que o MySQL vai tentar sempre preencher com zeros até completar 5 dígitos, ex: 00123.

Obs: Você precisa modificar também DEFAULT, NOT_NULL, e AUTO_INCREMENT se for o caso. Se você não especificar estes atributos eles serão modificados para o padrão do MySQL. Considere testar em uma tabela de testes antes.

Obs 2: Qualquer número negativo dentro desta coluna será convertido em 0 por conta de virar unsigned, portanto use com cautela.

ALTER TABLE tabela MODIFY numero INT(5) ZEROFILL NOT NULL;

Criando colunas com os atributos ZEROFILL E UNSIGNED

Este exemplo vai só para fins de referência, pois é a mesma coisa do ALTER TABLE.

Para criar uma tabela especificando esses atributos é bem mais fácil que modificar uma existente, pois você não precisa se preocupar com perda de dados.

Segue abaixo o código para criar uma tabela usando ZEROFILL e consequentemente UNSIGNED. Para modificar o tamanho da formatação dos zeros, modifique o tamanho de visualização do inteiro em INT(5):

CREATE TABLE tabela (numero INT(5) ZEROFILL);

Para criar uma coluna somente UNSIGNED:

CREATE TABLE tabela (numero INT(5) UNSIGNED);

Este artigo foi útil pra você?

Ricardo Metring

Ricardo Metring

Sou desenvolvedor full stack e co-fundador da Criar.io.
Trabalho há 10 anos com programação e sempre interessado em aprender mais.