Curiosidades sobre os tipos de dados do MySQL

types_mysqlO assunto deste post é sobre os tipos de dados do MySQL, mas vou postar algumas curiosidades sobre certos tipos de dados e não as cansativas tabelas informando quais tipos o MySQL suporta. As vezes são detalhes que passam desapercebidos pelo nosso cotidiano, construímos nossos banco de dados setamos os tipos de maneira padrão e nem nos atemos a certos detalhes.
 
INT: Esse tipo é utilizado em 90% dos casos como PRIMARY KEY e AUTO-INCREMENT nas tabelas. Geralmente quando construímos uma tabela e colocamos esse tipo em uma coluna o script fica assim:

Muitos colegas imaginam que esse (11) depois do INT seja para delimitar a quantidades de bytes aceitos no campo mas não é verdade. O valor máximo de bytes aceitos é 4, então podemos observar que não tem nada haver com 11. Ele informa que valores da coluna ID serão exibidos com a largura de 11 dígitos, confuso?
 
No exemplo acima imaginem os seguintes IDs cadastrados (1, 33, 2147483647), com a propriedade ZEROFILL marcada e com o tipo INT(11) o resultado seria esse:
 
ID
00000000001
00000000033
02147483647
 
Observem que o valor do campo foi preenchido com ‘0’ até atingir 11 dígitos, importante mencionar que para consultas em SQL continua valendo somente os números significativos, ou seja, sem o ‘0’ a esquerda. A largura de exibição não está relacionada com a faixa do tipo de dado, se o valor do ID for maior que a largura definida, será exibido o valor inteiro sem trucamento.

TINYINT: Pequeno mais poderoso o tipo TINYINT tem um intervalo de -128 até 127 e ocupa 1 byte, mas se for utilizado como UNSIGNED (só números positivos) seu intervalo vai de 0 até 255. Já presenciei tabela com campo COD_STATUS, onde o valor numérico máximo seria 200 mas o campo estava como VARCHAR(255), ou seja, completamente fora da normalidade sendo que o tipo TINYINT poderia resolver isso facilmente.

 
DATETIME e TIMESTAMP: Agora vamos para outra curiosidade, a diferença entre o tipo DATETIME e TIMESTAMP, geralmente o script de criação da tabela fica assim:

Ambos os tipos suportam o seguinte formato, ‘YYYY-MM-DD HH:MM:SS’ mas a diferença está no intervalo de tempo aceito. O intervalo de tempo (DATA e HORA) aceito pelo tipo DATETIME é de ‘1000-01-01 00:00:00’ até ‘9999-12-31 23:59:59’. Já  o intervalo para o tipo TIMESTAMP é de ‘1970-01-01 00:00:01 até ‘2038-01-19 03:14:07.
 
Podemos observar que o tipo DATETIME possui um intervalo maior que o tipo TIMESTAMP, tecnicamente essa diferença pode influenciar em uma data de nascimento onde a pessoa nasceu antes de 1970. É uma prática normal usar um campo com o tipo TIMESTAMP com default DATA e HORA do servidor gravando quando o registro foi incluído ou alterado.
 
VARCHAR: Esse talvez seja um dos tipos de dados mais utilizados no MySQL, VARCHAR. Campo alfanumérico que pode receber letras, números, símbolos etc. Esse tipo de dado tem um limite que é 255, mas existem desavisados que insistem em colocar com 500, 600 e por aí vai … em muitos casos para gravar observações de sistemas.
 
VARBINARY: Confesso que não o conhecia até precisar de uma validação de usuário e senha contendo comparação entre letras maiúsculas e minúsculas. 
VARBINARY: lembra muito o tipo VARCHAR, mas os 2 tem uma grande diferença quando seus valores são submetidos a comparações. O tipo VARBINARY guarda strings binárias e as comparações para esse tipo são executadas com base nos valores dos bytes, sendo assim existe um diferenciação entre letras maiúsculas e minúsculas, versões de caracteres que tenham diferentes acentuações. 
VARCHAR: grava strings não binárias  e comparações são baseadas na ordem do arranjo do conjunto de caracteres associados com a string, ou seja, não existem diferença entre maiúsculas e minúsculas.

Felizmente existe uma salvação para simular comparação com strings binárias, mesmo o tipo do campo sendo VARCHAR, podemos usar a palavra BINARY antes do campo a ser comparado:

Post relacionado:  (Parte 1) Importando planilhas do Excel para o MySQL usando PHP com PDO

PONTO FIXO E PONTO FLUTUANTE: O MySQL suporta como ponto fixo os tipos DECIMAL e NUMERIC, já o ponto flutuante como FLOAT e DOUBLE, mas qual a diferença entre eles:
DECIMAL e NUMERIC: Usa um formato de armazenamento de decimais fixos, todas os valores em coluna DECIMAL tem a mesma quantidade de casas decimais. Esses valores são armazenados como string usando um byte para cada valor, não está sujeito a erros de arredondamento porém o processamento com valores desse tipo de coluna são mais lentos em comparação com FLOAT e DOUBLE. Geralmente esses tipos de colunas são utilizados para guardar valores monetários e surtem bom desempenho.
FLOAT E DOUBLE: Esses tipos são utilizados para representar valores no formato binário de precisão simples ou dupla, por esse motivo seus valores possuem maior precisão. Acaba sendo um tipo muito eficiente para armazenamento em computação, mas seus valores estão sujeitos a erros de arrendondamento.

Dica: Para armazenar valores monetários utilize DECIMAL(10,2) ou NUMERIC(10,2) pois como foi mencionado acima esses tipos não são sujeitos a erros de arredondamento e preservam a exatidão.

Bom pessoal apresentei nesse artigo algumas curiosidades sobre os tipos de dados do MySQL, algumas nem eu conhecia até precisar e outras para minha surpresa nem instrutores para cursos em MySQL conheciam.

 
Até a próxima …
Tags:
Show Buttons
Hide Buttons