|
Os parênteses em campos numéricos do MySQL
por Celso Endo
"Campo INT(5)... o que isso quer dizer? Que eu posso guardar até 5 dígitos nesse campo, ou melhor, o valor máximo do campo será 99999?" Não! Muitas pessoas utilizam esses parênteses achando que significa o número máximo de dígitos para o campo, como em varchar() ou char(), mas isso não é verdade.
|
Vejo muitas pessoas que confundem os parênteses dessas colunas númericas (TINYINT, SMALLINT, MEDIUMINT, INT e BIGINT) do MySQL com os parênteses de colunas de caracteres (CHAR e VARCHAR). Admito que no começo, eu também me confundia com isso, até o dia que resolvi pesquisar na documentação do MySQL, fazer alguns testes, e vi que não era bem como eu pensava ser.
Como ainda hoje muitas pessoas se questionam com isso e tive/tenho que fazer muitas entrarem na documentação do MySQL para provar por A+B que não funcionam da mesma forma que CHAR e VARCHAR, então resolvi criar esse artigo, que parece ser uma coisa simples (e é!!!), mas que anda confundindo muitas pessoas.
Para quem já sabe o verdadeiro significado desses parênteses, convido-os a lerem mesmo assim e me corrijam se eu também estiver errado! :)
E para quem pensava até hoje que os parênteses significam o valor máximo a ser armazenado, ou o número de dígitos máximo, leiam e vejam a verdade!
Antes de mais nada, coloquem uma coisa na cabeça: O "range" (valor mínimo e valor máximo) das colunas TINYINT, SMALLINT, MEDIUMINT, INT e BIGINT não alteram, independente do que for colocado entre os parênteses.
Uma coluna definida como INT(1) continua armazenando até o valor 2.147.483.647 ou 4.294.967.295 (caso esteja com o atributo UNSIGNED).
Os parênteses dessas colunas podem ser comparados em parte (eu disse, em parte) com os parênteses de colunas do tipo CHAR. A diferença é que se a coluna for um desses numéricos, o MySQL não irá limitar a quantidade de caracteres do campo (exceto pelo "range", dependendo do tipo, óbvio).
Se você armazenar uma string de 3 caracteres numa coluna CHAR(5), o MySQL irá "preencher" os outros 2 caracteres com espaços, ou seja, sempre irá ocupar esse espaço de 5 caracteres na memória (mesmo que com espaços). Se você tentar armazenar uma string com mais de 5 caracteres, o MySQL irá "cortar" sua string para 5 caracteres, ou seja, se você tentar armazenar a string "código", o MySQL irá gravar "códig".
(Agora a revelação...)
Em uma coluna INT(5), se você armazenar um número de 3 dígitos, o MySQL TAMBÉM irá "preencher" os 2 dígitos restantes com espaços, ocupando SEMPRE, no mínimo, 5 caracteres na memória, assim como na coluna CHAR(5). PORÉM, se você armazenar um número superior a 5 dígitos (dentro do "range" definido pelo INT), o MySQL NÃO irá "cortar" seu número, irá gravar sem problemas. Está duvidando, então façam o teste! :)
Conclusão:
Se você utiliza uma coluna definida como INT(1) para servir como uma "flag" (por exemplo, 0 para registros inativos e 1 para ativos), podem continuar usando sem problemas, mas lembrem-se: o (1) não significa que você só pode armazenar dígitos de 1 caractere, se você "inputar" o valor 50320120 ele será armazenado também!
Uma observação: se você setar o atributo ZEROFILL para essas colunas, aí realmente esses parênteses poderão ter alguma utilidade (ou não!). Se você configurar uma coluna INT(5) com o atributo ZEROFILL e armazenar qualquer valor numérico abaixo de 5 caracteres, ao invés do MySQL preencher o restante com espaços, irá preencher com zeros (obviamente à esquerda, sempre!). Ou seja, se você armazenar o valor 342, será armazenado 00342. MAS ATENÇÃO!!! Mesmo com o atributo ZEROFILL, o (5) da definição da coluna continua NÃO SENDO limitador de caracteres, ou seja, você poderá armazenar o valor 20321874 sem problemas, a única diferença é que esse valor não tera zeros à esquerda, por possuir mais de 5 dígitos.
Resumindo, esses parênteses poderiam ser descritos como: "O valor que estiver entre eles, será o espaço mínimo ocupado por cada registro dessa coluna, mas NUNCA um limite de valores ou caracteres"
Para saber os valores mínimos e máximos dessas colunas:
http://dev.mysql.com/doc/refman/4.1/en/numeric-types.html
Espero que esse artigo sirva para compreender um pouco mais do conceito do MySQL!
|
|
|