- Tipos de Dados Fundamentais
1.1 Tipos Inteiros
Os tipos inteiros variam de acordo com o espaço de armazenamento e o intervalo de valores suportado. O uso da restrição UNSIGNED permite dobrar o limite superior ao descnosiderar números negativos.
| Tipo | Bytes | Bits | Intervalo (Unsigned) | Intervalo (Signed) |
|---|---|---|---|---|
| TINYINT | 1 | 8 | 0 a 255 | -128 a 127 |
| SMALLINT | 2 | 16 | 0 a 65535 | -32768 a 32767 |
| MEDIUMINT | 3 | 24 | 0 a 16777215 | -8388608 a 8388607 |
| INT | 4 | 32 | 0 a 4294967295 | -2147483648 a 2147483647 |
| BIGINT | 8 | 64 | 0 a 18.446.744.073.709.551.615 | -9.223.372.036.854.775.808 a 9.223.372.036.854.775.807 |
Observações importantes:
- O parâmetro de largura de exibição (ex:
INT(11)) não altera a capacidade de armazenamento, apenas como o dado é formatado comZEROFILL. Esta prática caiu em desuso a partir do MySQL 8.0.17.
1.2 Ponto Flutuante e Ponto Fixo
Para valores decimais, existem duas categorias: aproximados (FLOAT/DOUBLE) e exatos (DECIMAL).
- FLOAT e DOUBLE: Utilizam aritmética de ponto flutuante, o que pode gerar pequenas imprecisões em cálculos complexos.
- DECIMAL: Armazena números como strings internamente, garantindo precisão absoluta. É o padrão recomendado para aplicações financeiras.
-- Exemplo de comparação de precisão
CREATE TABLE controle_financeiro (
valor_float FLOAT(20,10),
valor_double DOUBLE(20,10),
valor_preciso DECIMAL(20,10)
);
INSERT INTO controle_financeiro VALUES (12345.6789012345, 12345.6789012345, 12345.6789012345);
Ao consultar os dados, o FLOAT apresentará distorções após a 7ª casa decimal, o DOUBLE após a 15ª, enquanto o DECIMAL manterá o valor exato definido.
1.3 Tipos de Texto: CHAR e VARCHAR
A escolha entre CHAR e VARCHAR impacta o desempenho e o consumo de disco:
- CHAR(n): Comprimento fixo. Se a string for menor que n, o banco preenche com espaços. É mais rápido para acessos diretos.
- VARCHAR(n): Comprimento variável. Armazena apenas o conteúdo real mais um prefixo de tamanho. Economiza espaço em strings de tamanhos diversos.
-- Demonstração de comportamento
CREATE TABLE cadastros (
sigla_estado CHAR(2),
descricao_longa VARCHAR(255)
);
Para medir o tamanho real dos caracteres armazenados, utiliza-se a função CHAR_LENGTH(coluna). No caso do CHAR, o MySQL normalmente remove os espaços de preenchimento na leitura, a menos que o sql_mode inclua PAD_CHAR_TO_FULL_LENGTH.
1.4 Datas e Horários
Os tipos temporais permitem gerenciar cronologia de forma eficiente:
- DATE: Apenas data (AAAA-MM-DD).
- TIME: Apenas horário (HH:MM:SS).
- DATETIME: Data e hora combinadas.
- YEAR: Apenas o ano.
CREATE TABLE agendamentos (
data_evento DATE,
hora_inicio TIME,
registro_completo DATETIME,
ano_referencia YEAR
);
INSERT INTO agendamentos VALUES ('2023-12-25', '14:30:00', '2023-12-25 14:30:00', '2023');
1.5 ENUM e SET
São tipos de objetos de string que restringem as entradas a valores pré-definidos:
- ENUM: Permite escolher exatamente um valor de uma lista.
- SET: Permite escolher zero ou mais valores de uma lista.
CREATE TABLE perfil_usuario (
nivel_acesso ENUM('admin', 'editor', 'leitor'),
interesses SET('tecnologia', 'esportes', 'musica')
);
- Restrições (Constraints)
Restrições são regras aplicadas às colunas para garantir a validade e a integridade dos dados inseridos.
2.1 NOT NULL e UNIQUE
- NOT NULL: Impede que o campo fique vazio (NULL).
- UNIQUE: Garante que não existam dois registros com o mesmo valor na coluna, permitindo, porém, valores nulos (se não houver restrição NOT NULL).
CREATE TABLE inventario (
item_id INT NOT NULL,
codigo_barras VARCHAR(50) UNIQUE
);
2.2 Chave Primária (PRIMARY KEY)
A Chave Primária é o identificador exclusivo de uma linha. Por definição, ela é NOT NULL e UNIQUE simultaneamente. Além disso, o banco de dados cria um índice clusterizado para otimizar buscas por esta coluna.
-- Chave primária simples
CREATE TABLE clientes (
cliente_id INT PRIMARY KEY,
nome VARCHAR(100)
);
-- Chave primária composta
CREATE TABLE itens_pedido (
pedido_id INT,
produto_id INT,
PRIMARY KEY (pedido_id, produto_id)
);
2.3 Incremento Automático (AUTO_INCREMENT)
Geralmente associado à Chave Primária, o AUTO_INCREMENT gera sequências numéricas automaticamente.
CREATE TABLE logs_sistema (
log_id INT PRIMARY KEY AUTO_INCREMENT,
mensagem TEXT
);
-- Ajustando o valor inicial do incremento
ALTER TABLE logs_sistema AUTO_INCREMENT = 1000;
Se registros forem excluídos, o contador do AUTO_INCREMENT não retrocede automaticamente, garantindo que identificadores antigos não sejam reutilizados imediatamente por novos dados.