Programa
Quando você começa a trabalhar com SQL, é fácil pensar nos tipos de dados como simples rótulos. Uma única coluna guarda números, texto, datas ou tipos de dados especiais. Mas um tipo de dados é mais do que só um rótulo. É um conjunto de regras que define o que é um valor na visão do banco de dados.
Na prática, os tipos de dados moldam a maneira como o SQL “entende” as informações em seu banco de dados. É um conjunto de instruções que fornece ao SQL o contexto necessário para ler, comparar e processar seus dados com precisão.
Neste tutorial, vamos ver as principais categorias de tipos de dados SQL e como elas funcionam em diferentes sistemas de gerenciamento de bancos de dados. Recomendo que você acompanhe os exemplos ao longo do texto.
Se você ainda não trabalhou muito com tabelas de banco de dados, nosso Fundamentos de SQL oferece uma base clara e fácil de entender para iniciantes, ajudando a compreender como conjuntos de dados como esse são estruturados.
O que são tipos de dados SQL?
Um tipo de dados descreve o formato dos seus dados: os tipos de valores que uma coluna pode conter, como esses valores são armazenados internamente e as operações que fazem sentido executar neles.
Isso quer dizer que a escolha do tipo de dados afeta mais do que só o design da tabela. Isso pode influenciar as necessidades de armazenamento, o desempenho das consultas, o comportamento de classificação, as operações matemáticas e até mesmo a forma como diferentes sistemas interpretam o mesmo valor.
Aqui está uma tabela simples que usa vários tipos ao mesmo tempo:
CREATE TABLE employees (
id INT,
name VARCHAR(50),
start_date DATE,
active BOOLEAN,
salary DECIMAL(10, 2)
);
Cada coluna nesta tabela define o tipo de dados que pode conter.
-
A coluna “
id” vai guardar números inteiros, dando a cada funcionário um identificador único. -
A coluna "
name" (Nome do usuário) pode conter até 50 caracteres de texto, então você pode guardar nomes curtos. -
A coluna “
start_date” é pra datas do calendário. -
A coluna “
active” (Ativo) vai guardar valores verdadeiros ou falsos, facilitando o acompanhamento dos funcionários que estão ativos no momento. -
Por fim, a coluna “
salary” (Valor total) vai guardar valores monetários com uma precisão de 10 dígitos, mantendo dois dígitos após a vírgula decimal para centavos.
Juntas, essas colunas formam uma tabela estruturada que impõe regras sobre os tipos de valores permitidos em cada campo. Isso torna os dados mais previsíveis e fáceis de trabalhar.
Vamos adicionar alguns dados de exemplo a isso e ver como ficaria a tabela resultante, usando o PostgreSQL.
INSERT INTO employees (id, name, start_date, active, salary)
VALUES
(1, 'Alice Johnson', '2025-01-15', TRUE, 55000.00),
(2, 'Bob Smith', '2024-06-01', FALSE, 62000.50);
SELECT *
FROM employees;
|
id |
nome |
start_date |
ativo |
salário |
|
1 |
Alice Johnson |
2025-01-15 |
VERDADEIRO |
55.000,00 |
|
2 |
Bob Smith |
2024-06-01 |
FALSO |
62.000,50 |
Os sistemas de banco de dados de aluguel Diffeseguem os mesmos princípios, mas variam em nomes e recursos. Por exemplo, o SQL Server usa BIT em vez de BOOLEAN, e o MySQL trata BOOLEAN como um número inteiro pequeno.
Categorias de tipos de dados SQL
Existem quatro categorias principais de tipos de dados: numérico, caractere, data e especial. Vamos ver cada um com mais detalhes.

Tipos de dados numéricos
Os tipos numéricos guardam números inteiros ou decimais. O tipo numérico específico vai determinar o intervalo, a precisão e o tamanho de armazenamento dos números guardados. Os tipos de dados mais comuns nesta categoria são:
-
inteiros, como
INT,SMALLINTeBIGINT, para números inteiros, -
decimais, como
DECIMAL(p, s)eNUMERIC(p, s), para valores decimais exatos, -
e flutua, como
FLOATeDOUBLE, para valores aproximados que podem trazer pequenas diferenças de arredondamento.
Vamos criar uma tabela de exemplo para mostrar os diferentes tipos de dados numéricos:
CREATE TABLE products (
product_id INT,
price DECIMAL(8, 2),
measurement FLOAT
);
INSERT INTO products VALUES
(1, 19.99, 3.1415),
(2, 250.56, 2.71828);
SELECT * FROM products;
Atabela de resultadosficaria assim:
|
product_id |
preço |
medição |
|
1 |
19,99 |
3,1415 |
|
2 |
250,56 |
2,71828 |
Como você pode ver, a primeira coluna é limitada a um número inteiro, a segunda a um decimal com dois dígitos após a vírgula decimal e a terceira é uma vírgula decimal com um número indefinido de dígitos.
À primeira vista, pode parecer que DECIMAL e FLOAT são a mesma coisa. Mas tem uma diferença importante: DECIMAL guarda um número exato com um número específico de casas decimais, enquanto FLOAT mantém um valor aproximado que pode variar um pouco de acordo com o sistema.
É importante usar decimais quando precisar de precisãoe só usar floats se pequenos erros de arredondamento forem aceitáveis.
|
Categoria |
Tipo(s) de dados |
Finalidade / O que armazena |
Exemplos de valores |
|
Numérico |
|
Números inteiros de tamanhos diferentes |
1, 42, 1000 |
|
Numérico |
|
Valores decimais exatos com precisão fixa |
19,99, 250,56 |
|
Numérico |
|
Valores decimais aproximados. Pode ter pequenas diferenças de arredondamento |
3,1415, 2,71828 |
Tipos de dados de caracteres e cadeias de caracteres
Os tipos de caracteres armazenam texto. Existem alguns tipos diferentes que variam em desempenho e eficiência de armazenamento.
-
CHAR(n)é para conjuntos de caracteres de comprimento fixo. Isso é útil para dados que sempre têm o mesmo tamanho, como códigos de estados ou abreviações de aeroportos. -
VARCHAR(n)é para conjuntos de caracteres de comprimento variável. É útil para nomes, endereços de e-mail e outros textos inseridos pelo usuário. -
TEXTe tipos parecidos são usados pra grandes blocos de texto sem estrutura, tipo posts de blog ou descrições de produtos.
Alguns sistemas, como o SQL Server, até suportam tipos de cadeias Unicode, como NCHAR e NVARCHAR, que são úteis quando seus dados incluem texto em vários sistemas de escrita, como latim, chinês ou cirílico .
|
Categoria |
Tipo(s) de dados |
Finalidade / O que armazena |
Exemplos de valores |
|
Caractere / String |
|
Texto de comprimento fixo |
'US', 'CA' |
|
Caractere / String |
|
Texto de comprimento variável |
“Alice Johnson”, “Bob Smith” |
|
Caractere / String |
|
Grandes blocos de texto sem estrutura |
“Prefiro contato por e-mail.”, “Preciso de uma cópia da fatura para cada pedido.” |
|
Caractere / String |
|
Texto Unicode de comprimento fixo ou variável |
'Å', 'É', 'München', 'São Paulo' |
Vamos ver como isso fica com umatabela de exemplo mostrando diferentes tipos de dados de string:
CREATE TABLE customers (
id INT,
country_code CHAR(2),
name VARCHAR(100),
notes TEXT
);
INSERT INTO customers VALUES
(1, 'US', 'Alice Johnson', 'Preferred contact by email.'),
(2, 'CA', 'Bob Smith', 'Requires invoice copy for each order.');
SELECT * FROM customers;
Aqui está como essa tabela ficaria no final. Você pode ver as diferenças de comprimento codificadas em cada tipo de dados de string.
|
id |
country_code |
nome |
notas |
|
1 |
EUA |
Alice Johnson |
Prefiro contato por e-mail. |
|
2 |
CA |
Bob Smith |
Precisa de uma cópia da fatura para cada pedido. |
Aqui, CHAR(2) exige um comprimento consistente, enquanto VARCHAR e TEXT permitem mais flexibilidade.
Tipos de dados de data e hora
Os tipos de dados de data e hora permitem armazenar e consultar informações temporais com precisão. Os iniciantes podem achar que podem usar tipos de dados numéricos ou de cadeia de caracteres para codificar esse tipo de informação. Mas, fazer isso pode trazer problemas mais tarde na hora de analisar os dados. Usar um tipo de dados de calendário específico pode facilitar tudo.
Os três tipos mais usados são:
-
DATE, que codifica o ano, o mês e o dia, -
TIME, que guarda a hora, os minutos e os segundos, -
e
DATETIMEouTIMESTAMP, que guardam uma data e hora combinadas.
Os bancos de dados modernos podem até suportar segundos fracionários ou tipos de dados sensíveis ao fuso horário, como TIMESTAMPTZ no PostgreSQL, que armazena carimbos de data/hora em UTC e os converte automaticamente para o fuso horário da sua sessão no momento da recuperação.
|
Categoria |
Tipo(s) de dados |
Finalidade / O que armazena |
Exemplos de valores |
|
Data / Hora |
|
Datas do calendário (ano, mês, dia) |
'2025-11-26' |
|
Data / Hora |
|
Hora do dia (hora, minuto, segundo) |
09:30:00, 18:45:30 |
|
Data / Hora |
|
Data e hora combinadas |
'2025-11-20 14:15:00', '2025-11-21 09:00:00' |
|
Data / Hora |
|
Data e hora combinadas com fuso horário (PostgreSQL) |
'2025-11-21 09:00:00+00' |
Vamos criar uma tabela simples paramostrar esses tipos de dados temporais:
CREATE TABLE events (
event_id INT,
event_date DATE,
start_time TIME,
created_at DATETIME
);
INSERT INTO events VALUES
(1, '2025-11-26', '09:30:00', '2025-11-20 14:15:00'),
(2, '2025-12-01', '18:45:30', '2025-11-21 09:00:00');
SELECT * FROM events;
Aqui está o que a tabelaficaria ficaria:
|
event_id |
event_date |
start_time |
created_at |
|
1 |
2025-11-26 |
09:30:00 |
2025-11-20 14:15:00 |
|
2 |
2025-12-01 |
18:45:30 |
2025-11-21 09:00:00 |
Você podever como escolher a data ou o tipo de carimbo de data/hora certos pode afetar o tipo de dados que você pode armazenar.
Booleano e outros tipos especiais de dados
Nem todos os tipos de dados se encaixam perfeitamente em uma das categorias anteriores. Para isso, o SQL inclui um conjunto de tipos de propósito específico para casos de uso específicos. Alguns dos mais comuns que você pode ver incluem:
-
Valores booleanos (
BOOLEAN,BOOLouBIT, dependendo do sistema) para registrar verdadeiro ou falso, -
Dados binários (
BLOB) para imagens, arquivos ou objetos serializados. -
Texto grande (
CLOB) para documentos em tamanho real, -
JSON(no MySQL e PostgreSQL) para dados sem esquema ou aninhados -
ARRAY(só no PostgreSQL) para listas -
UUIDpara identificadores únicos que não dependem de sequências numéricas, como um token de sessão ou um código de rastreamento global.
Os tipos especiais permitem que você armazene dados mais ricos ou flexíveis quando as tabelas tradicionais por si só não captam a estrutura.
|
Categoria |
Tipo(s) de dados |
Finalidade / O que armazena |
Exemplos de valores |
|
Especial / Booleano / Outro |
|
Valores verdadeiros ou falsos |
VERDADEIRO, FALSO |
|
Especial / Booleano / Outro |
|
Objetos binários grandes (imagens, arquivos) |
[dados de imagem binária] |
|
Especial / Booleano / Outro |
|
Documentos de texto grandes |
Texto completo do contrato... |
|
Especial / Booleano / Outro |
|
Dados estruturados ou aninhados |
'{"name": “Alice” |
|
Especial / Booleano / Outro |
|
Listas de valores (só PostgreSQL) |
[1,2,3] |
|
Especial / Booleano / Outro |
|
Identificadores únicos globais |
'550e8400-e29b-41d4-a716-446655440000' |
Tipos de dados SQL em diferentes sistemas
Os sistemas de gerenciamento de banco de dados diferem nos detalhes de como utilizam esses tipos de dados. Embora as categorias gerais continuem as mesmas, os nomes e comportamentos exatos variam entre os sistemas.
Diferentes sistemas criam seus tipos de dados com suas próprias prioridades, e é por isso que eles se comportam de maneiras diferentes. Algumas diferenças são pequenas, como a palavra-chave exata usada. Outros mudam como os dados se comportam na prática, como limites no tamanho do texto, como os booleanos são armazenados ou se o sistema suporta formatos especializados.
O MySQL dá uma ênfase na velocidade e simplicidade, então usa opções práticas e leves, como o tipo de dados booleano ( TINYINT, que é tecnicamente armazenado como números) para valores booleanos. Ele prioriza o desempenho e a ampla compatibilidade em vez de uma semântica de tipos rígida.
O PostgreSQL quer seguir os padrões e ser extensível. Isso aparece no fato de que ele usa um tipo verdadeiro de “ BOOLEAN ” e tem um conjunto mais rico de opções de tipos de dados, como “ ARRAY ” e “ JSONB ” para guardar dados estruturados ou aninhados diretamente em uma coluna.
O SQL Server foi feito pra ter um desempenho previsível em ambientes corporativos e uma integração profunda com o ecossistema da Microsoft. É por isso que ele oferece tipos bem definidos, como BIT para booleanos e VARCHAR(MAX) para textos grandes.
A tabela abaixo mostra como três grandes sistemas SQL implementam conceitos comuns.
|
Conceito |
MySQL |
PostgreSQL |
SQL Server |
|
Numéricos (números inteiros) |
Usa |
Usa |
Usa |
|
Números decimais/de precisão fixa |
Usa |
Usa o |
Usa |
|
Cadeias de texto de comprimento padrão |
Usa |
Usa |
Usa |
|
Armazenamento de texto grande |
Usa |
Usa |
Usa |
|
Valores booleanos |
Armazena valores booleanos como |
Usa valores nativos do |
Usa |
|
Chaves primárias com autoincremento |
Usa a palavra-chave ` |
Usa |
Usa |
|
Sequências de caracteres muito grandes |
Usa |
Permite um tamanho de lista de valores ( |
Usa |
|
Armazenamento JSON |
Suporta |
Suporta tanto |
Suporta |
|
Armazenamento em matriz |
Não suporta tipos de matriz |
Suporta |
Não suporta tipos de matriz |
O que isso significa na prática
Os objetivos de design de cada sistema e os tipos de cargas de trabalho para os quais eles são otimizados influenciam diretamente a forma como são construídos para funcionar.
Essas diferenças significam que, embora muitas habilidades comuns de SQL sejam facilmente transferíveis entre sistemas, detalhes como tamanho máximo de texto, palavras-chave de incremento automático ou suporte para estruturas complexas podem variar.
Se você estiver usando só um sistema, é fácil se tornar um especialista nos detalhes do seu sistema de gerenciamento de banco de dados. Mas, mudar de emprego ou de departamento pode fazer com que você tenha que lidar com um sistema de gerenciamento de banco de dados diferente, com regras diferentes.
Por isso, quando estiver aprendendo SQL, é legal entender os conceitos comuns por trás dos tipos de dados, em vez de só se basear nas particularidades de um único sistema.
Escolhendo o tipo de dados certo
Às vezes, escolher um tipo de dados é bem simples. Mas às vezes é preciso pensar um pouco. Uma boa escolha facilita a consulta dos seus dados, mantém o armazenamento enxuto e ajuda a evitar bugs no futuro. A categoria geral provavelmente vai depender do tipo de dados que você tem.
Dados numéricos
Por exemplo, digamos que você está guardando dados de medição. Claro, você vai querer algum tipo de número, não um calendário ou uma sequência de caracteres. Mas qual é o nível de precisão das medições que você quer guardar? Os números inteiros estão OK ou você precisa de decimais? Quer um número fixo de dígitos significativos?
Então você deve pensar no armazenamento e na eficiência. Escolher o menor tipo de inteiro que pode guardar seus dados com segurança vai ajudar a manter suas tabelas eficientes. Os tipos menores usam menos espaço de armazenamento e podem melhorar o desempenho, principalmente em tabelas grandes. Normalmente, você vai querer escolher um tipo grande o suficiente para o seu alcance esperado, sem ir muito além do que você realmente precisa.
Quando um número inteiro não funcionar, você pode escolher entre um DECIMAL ou um FLOAT. Os tipos de ponto flutuante aproximam os valores em vez de armazená-los exatamente, o que pode causar erros de arredondamento em trabalhos financeiros, científicos ou outros trabalhos que exigem precisão.
DECIMAL e NUMERIC armazenam valores exatos, tornando-os melhores para qualquer coisa que envolva preços ou proporções. Mas, os números de 10 dígitos ( DECIMALs) costumam precisar de mais espaço de armazenamento do que os de 9 dígitos ( FLOATs), dependendo de quantos pontos decimais você salva.
Dados de caracteres e cadeias de caracteres
Para dados de cadeia de caracteres, você vai querer pensar no tamanho que quer que cada entrada tenha.
Normalmente, você vai querer dimensionar os campos de um VARCHAR e de forma realista, em vez de usar o comprimento máximo padrão. Limites muito grandes geralmente não melhoram a flexibilidade, mas podem confundir os desenvolvedores futuros sobre o tamanho esperado dos dados.
Pense nas informações que você espera receber, sejam nomes, e-mails ou títulos de produtos, e ajuste o tamanho da coluna de acordo com isso.
Dados de data e hora
Para dados de calendário, é bom ser bem preciso sobre o que você está guardando.
Se você só precisa de uma data ou só precisa de uma hora, geralmente é melhor usar DATE ou TIME em vez de DATETIME. Essas escolhas deixam suas intenções bem claras e diminuem as chances de confusão depois. Eles também dão ao banco de dados um pouco mais de espaço para otimizar consultas apenas de data ou apenas de hora.
Dados booleanos
Sempre que possível, use tipos apropriados para o domínio, como BOOLEAN, em vez de soluções alternativas, como inteiros ou strings. Os tipos nativos incluem validação integrada, semântica mais clara e suporte de funções de banco de dados que esperam tipos específicos de dados.
Abaixo está um resumo das metas comuns de armazenamento de dados e os tipos de dados SQL recomendados para atendê-las.
|
Objetivo |
Tipo de dados recomendado |
Por que |
|
Armazene valores numéricos exatos (dinheiro, medidas) |
|
Armazena valores precisos sem problemas de arredondamento de ponto flutuante |
|
Armazene textos curtos ou médios |
|
Armazenamento eficiente com tamanho previsível e comprimento flexível |
|
Armazene textos longos e não estruturados |
|
Feito pra blocos de texto, tipo descrições ou documentos |
|
Armazene só a data ou só a hora |
|
Evita complicações desnecessárias e mostra o verdadeiro significado dos dados. |
|
Armazene valores flexíveis, tipo documentos |
|
Ótimo pra estruturas aninhadas ou em evolução que não se encaixam em colunas fixas |
Praquem quer dar uma repassada sobre como agrupar e filtrar dados, o SQL Intermediário explica essas habilidades básicas.
Erros comuns e melhores práticas
Mesmo um esquema de banco de dados simples pode ter problemas se os tipos de dados não forem escolhidos com cuidado.
Truncagem
Por exemplo, se você tiver uma coluna para nomes que só aceita 5 caracteres, pode acabar com “Micha” em vez de “Michael”. Esse é um problema comum chamado truncamento.
Isso geralmente aparece em campos como nomes, endereços ou comentários, onde as variações do mundo real podem ultrapassar um limite otimista. Uma maneira de evitar isso é dimensionar os campos de texto com base em exemplos reais ou errar para o lado do excesso de comprimento.
Erros de arredondamento
Outro problema comum é o arredondamento inesperado quando valores de ponto flutuante são usados para dinheiro ou outros dados que exigem precisão. Como o FLOATarmazena valores aproximados, pequenas diferenças podem se acumular e afetar relatórios, resumos ou cálculos.
Você pode evitar isso escolhendo DECIMAL para qualquer coisa que envolva moeda ou valores decimais exatos. Isso vai garantir que o banco de dados mantenha os números estáveis.
Incompatibilidades de tipos
Incompatibilidades de tipos também podem causar lentidão nas consultas, principalmente em junções ou comparações.
Quando uma coluna é armazenada como uma string e outra como um inteiro (ou quando cada tabela usa um tipo ligeiramente diferente) e você tenta uni-las, o banco de dados pode ter que converter os valores instantaneamente. Isso pode causar erros e aumentar custos desnecessários.
Manter as colunas relacionadas alinhadas no tipo evita essas conversões ocultas e ajuda as consultas a serem executadas com mais facilidade.
Formatação da data
As datas do calendário têm seus próprios problemas.
As inconsistências na formatação de datas são uma das principais fontes de confusão quando os sistemas misturam convenções locais ou quando os desenvolvedores armazenam datas como strings em vez de usar tipos de data adequados. Essas inconsistências podem fazer com que as consultas não funcionem direito ou devolvam resultados errados sem avisar.
A solução mais simples é usar tipos de data reais e manter um formato consistente e sem ambiguidades ao trabalhar com datas em formato de texto. Eu recomendo muito o nosso cursoAnálise de séries temporais no SQL Server ( ) para ajudar a evitar os problemas mais comuns com calendários nas suas bases de dados.
Melhores práticas
Aqui estão algumas práticas recomendadas para garantir que seus bancos de dados funcionem perfeitamente:
-
Preencha as tabelas com dados de amostra logo no início do processo de design para ver se tem alguma falha no tamanho ou na escolha dos tipos.
-
Documente a finalidade e os intervalos esperados de cada uma das suas colunas para que alterações futuras não causem incompatibilidades.
-
Evite usar tipos genéricos quando outros mais específicos melhorariam a clareza.
Conclusão
Os tipos de dados definem como o seu banco de dados “entende” os valores que você armazena. Eles influenciam tudo, desde o armazenamento até o desempenho e a clareza. Aprender como eles funcionam torna seus bancos de dados mais confiáveis e previsíveis.
Para ler mais sobre esse assunto, dá uma olhada no Tutorial de visão geral do banco de dados SQL e Tipos de dados SQLite: Uma análise detalhada das classes de armazenamento. Também recomendo o curso curso PostgreSQL Summary Stats and Window Functions, que mostra como calcular totais acumulados e estatísticas ordenadas.
Um tipo de dados no SQL define o tipo de dados que uma coluna pode armazenar e como esses dados se comportam quando consultados ou processados. Isso afeta o armazenamento, a validação, a classificação, a comparação e as operações matemáticas.
Perguntas frequentes sobre tipos de dados SQL
O que é um tipo de dados em SQL?
Um tipo de dados no SQL é um conjunto de regras que diz ao SQL que tipo de informação esperar dentro da coluna do seu banco de dados. É basicamente a maneira como o seu sistema “entende” os seus dados.
Como faço pra definir uma coluna como um tipo de dados específico no SQL?
Quando você define uma coluna no SQL, você define o tipo de dados logo depois de dar um nome à coluna. Vai ficar mais ou menos assim: name DATATYPE. Você também pode usar o comando ` ALTER COLUMN ` para atualizar o tipo de dados em uma coluna que você já definiu.
Por que preciso escolher o tipo de dados certo?
Escolher o melhor tipo de dados para seus dados deixará claro que tipo de dados você possui, garantirá o armazenamento e uso adequados e evitará erros posteriores em seu código.
Qual é a diferença entre DECIMAL e FLOAT?
Um número de ponto fixo ( DECIMAL ) é um tipo de dado numérico preciso que guarda o número com um número fixo de casas decimais. Por outro lado, um número de ponto flutuante ( FLOAT) é um tipo de dado que guarda uma aproximação do número.
Todos os sistemas de gerenciamento de banco de dados usam os mesmos tipos de dados?
Sim e não. Cada sistema de gerenciamento de banco de dados tem tipos de dados parecidos para números, caracteres e datas. Mas eles diferem em seus nomes específicos, como são usados nos bastidores e nos tipos de dados especiais que suportam.

Sou PhD e tenho 13 anos de experiência trabalhando com dados em um ambiente de pesquisa biológica. Crio software em várias linguagens de programação, incluindo Python, MATLAB e R. Sou apaixonado por compartilhar meu amor pelo aprendizado com o mundo.

