Banco de Dados MySQL Tipos de Dados

A entidade principal de um banco de dados é a tabela. E uma tabela possui colunas, que chamamos de campos. Os campos possuem tipos.

Os tipos de dados são classificados em diferentes categorias e permitem N formatos. As categorias se diferenciam basicamente pelo espaço em bytes usado por cada uma. E é claro, quanto maior o espaço, maior o conjunto de dados a serem armazenados.

Tipos Numéricos

Inteiros

TipoValor em BytesMenor valor com sinal – signedMenor valor sem sinal – unsignedMaior valor com sinal – signedMaior valor sem sinal – unsigned
Tinyint1-1280127255
Smallint2-3276803276765535
Mediumint3-83886080838860716777215
Int4-2147483648021474836474294967295
Bigint8-2 elevado à 6302^63-12^64-1

Propriedade UNSIGNED: não permite sinal no número.

Decimais

Os números decimais podem ser de precisão fixa ou ponto flutuante. Ponto flutuante significa dizer que há um arredondamento quando o número de casas decimais for maior do que o permitido no banco, já na precisão fixa há o truncamento seco, sem nenhum arredondamento.

Decimais de Ponto Flutuante

Os dois tipos de decimais com pontos flutuantes permitidos no MySQL são Float e Double. A diferença entre os dois simplesmente é tamanho de armazenamento e, consequentemente, precisão. O Double arredonda com mais precisão e utiliza 8 bytes enquanto o Float utiliza 4.

Decimais de Precisão Fixa

Os Decimais fixos são: Decimal e o Numeric. Os dois são iguais e seu tamanho é definido em número de dígitos. Eles podem ter até 65 dígitos.

Binário

Binário também é um tipo numérico, e pode ter um tamanho de até 64 bits.

Alguns Atributos dos Tipos de Dados Numéricos

SIGNED – UNSIGNED: Indica se possui ou não sinal no número;

ZEROFILL: Preenche os algarismos à esquerda com zeros quando não há números;

AUTO_INCREMENT: sequência auto incrementada. Posso decidir se ela começará de zero ou não, bem como o valor de incremento que aplico, se será de um em um ou obedecendo alguma regra específica;

Data e Hora

Date: armazena datas desde o dia 01 de janeiro do ano 1000 até 31 de dezembro de 9999. As datas geralmente são armazenadas no formato YYYY-MM-DD ano-mês-dia.

1000-01-01 até 9999-12-31

Datetime: muito parecido com o Date mas além da data, armazena também a hora.

1000-01-01 00:00:00 até 9999-12-31 23:59:59

Timestamp: é muito parecido com o Datetime, mas dois pontos principais a diferenciam. Possui um intervalo menor, abrange da zero hora do dia 01 de janeiro de 1970 à meia noite do dia 19 de janeiro de 2038 e guarda também informações de fuso horário.

1970-01-01 00:00:00 UTC até 2038-01-19 23:59:59 UTC

Um caso de uso do Timestamp pode ser na implementação de um sistema de agendas. Para uma empresa que tem filiais em diversos países, por exemplo, a hora da reunião pode não ser a mesma para todos os participantes e o sistema precisa tratar disso.

Time: armazena somente a hora e tem um intervalo de -838:59:59 até 839:59:59.

Year: armazena somente o ano e vai de 1901 até 2155.

Tipos String

Existem os tipos de dados string não-binários e binários. A diferença é que no primeiro tipo, os dados são armazenados em caracteres, e, no segundo, em binário.

Uma vez que um tipo é armazenado em binário e outro em caractere, as comparações para o tipo não-binário são feitas entre caracteres e os binários são baseados em comparação byte-a-byte.

Não-binários

Os tipos de dados String não-binários são: CHAR, VARCHAR, TEXT, TINYTEXT, MEDIUMTEXT e LONGTEXT.

Os mais utilizados nessa categoria são CHAR e o VARCHAR, cujo tamanho máximo de cada um é 255 caracteres. A diferença entre eles está nos espaços. Vamos explicar com um exemplo:

Digamos que eu tenha declarado um campo com tamanho quatro - CHAR(4), ou seja, suporta, no máximo, quatro caracteres.

Quero armazenar nesse campo o dado 'aa', que ocuparia dois caracteres. Se o campo for do tipo CHAR, será gravado dois espaços em branco, e depois, de fato dois caracteres de dados. Ficando da seguinte forma: ' aa'. O resultado é que os quatro caracteres serão ocupados sempre, mesmo que com espaços em branco.

Agora, se eu tiver o mesmo campo, delimitando seu tamanho máximo em quatro, mas com o tipo VARCHAR, ao gravar o dado 'aa' somente dois caracteres seriam ocupados.

Dessa forma, em situações onde gravar o vazio não é importante, é mais conveniente usar o VARCHAR por ocupar menos espaço em disco.

Os tipos TEXT são usados para armazenar texto longo.

Binários

Já os tipos de dados Strings que armazenam e manipulam os dados de forma binária são o BINARY, VARBINARY, BLOB, TINYBLOB, MEDIUMBLOB e LONGBLOB.

Os mais usados são o BINARY e o VARBINARY que seguem a mesma lógica do CHAR e VARCHAR, com a diferença de que armazenam e manipulam os dados em binários e não em caracteres. Portanto, quando especificamos o tamanho do campo esse tamanho é em bytes.

A família dos BLOBs (binary large objects) armazena binários longos. Com esse tipo de campo, posso por exemplo, armazenar os binários de uma foto ou música dentro do banco de dados, embora recuperar esses dados na sequência seja um processo lento.

Atributos de Campos do Tipo String

COLLATE

COLLATE é uma cláusula que pode ser aplicada a uma definição de banco de dados ou a uma definição de coluna para definir o agrupamento ou a uma expressão de sequência de caracteres para aplicar um elenco de agrupamento.

Em resumo, especifica o conjunto de caracteres e regras que está utilizando.

Ao separar o COLLATE LATIN1_GENERAL_CS_AI, temos as seguintes funções.

LATIN1: Define o charset que será utilizado. Você pode fazer isso para o banco ou por consulta.

CS: Especifica como Case Sensitive;

AI: Especifica como Accent Insensitive.

Também temos outras opções, como:

CI: Especifica como Case Insensitive.

AS: Especifica como Accent Sensitive.

BIN: Especifica a ordem de classificação a ser utilizada como binária.

Mas o que isso tudo quer dizer?

Veja o código abaixo:

DECLARE @texto varchar(50);
SET @texto = 'Olhe VOCÊ, está querendo aprender sobre COLLATES?';

--Retorno: True
SELECT CASE WHEN @texto LIKE '%voce%' COLLATE Latin1_general_CI_AI THEN  'True' ELSE 'False' END

--Retorno False
SELECT CASE WHEN @texto LIKE '%voce%' COLLATE Latin1_general_CS_AI THEN  'True' ELSE 'False' END

--Retorno: False
SELECT CASE WHEN @texto LIKE '%voce%' COLLATE Latin1_general_CI_AS THEN  'True' ELSE 'False' END

Em todos os casos eu estou buscando se existe a palavra voce em qualquer lugar da frase.

Note que no primeiro SQL eu estou utilizando AI (Accent Insensitie) , ou seja, acentos não me interessam e CI (Case Insensitive), ou seja, não me importa se tiverem caracteres maiúsculos ou minúsculos. E com isso o meu resultado será True, pois no texto eu possuo a palavra VOCÊ.

Nos outros casos, onde eu estou utilizando CS e AS, os resultados são False, pois quero que ele considere os acentos e diferencie maiúsculas de minúsculas.

Tipo ENUM

Só aceita os valores que enumerarmos na criação do campo. Exemplo, criando um campo chamado FORMA_DE_PAGAMENTO e elegendo BOLETO, DINHEIRO e CARTAO, essas serão as únicas entradas permitidas.

NULL

O null é um tipo especial suportado pelo banco de dados para representar o vazio, e o padrão do MySQL é permitir null nas colunas. Se você não quiser esse comportamento para um campo específico, informe com a sintaxe not null na criação ou alteração da tabela.

Artigos Relacionados