Tipos de dados SQL: Guia essencial para iniciantes
Domine os tipos de dados SQL no MySQL, PostgreSQL e SQL Server. Aprenda a escolher os formatos numéricos, de texto e de data certos para otimizar o desempenho e a integridade dos dados.
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, nossoFundamentos 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:
CREATETABLE employees (
id INT,
name VARCHAR(50),
start_date DATE,
active BOOLEAN,
salary DECIMAL(10,2));Tecnologia
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.
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, SMALLINT e BIGINT, para números inteiros,
decimais, como DECIMAL(p, s) e NUMERIC(p, s), para valores decimais exatos,
e flutua, como FLOAT e DOUBLE, 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:
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
INT, SMALLINT, BIGINT
Números inteiros de tamanhos diferentes
1, 42, 1000
Numérico
DECIMAL(p,s), NUMERIC(p,s)
Valores decimais exatos com precisão fixa
19,99, 250,56
Numérico
FLOAT, DOUBLE
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.
TEXT e 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
CHAR(n)
Texto de comprimento fixo
'US', 'CA'
Caractere / String
VARCHAR(n)
Texto de comprimento variável
“Alice Johnson”, “Bob Smith”
Caractere / String
TEXT
Grandes blocos de texto sem estrutura
“Prefiro contato por e-mail.”, “Preciso de uma cópia da fatura para cada pedido.”
Caractere / String
NCHAR(n), NVARCHAR(n)
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:
CREATETABLE customers (
id INT,
country_code CHAR(2),
name VARCHAR(100),
notes TEXT);INSERTINTO customers VALUES(1,'US','Alice Johnson','Preferred contact by email.'),(2,'CA','Bob Smith','Requires invoice copy for each order.');SELECT*FROM customers;Tecnologia
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 DATETIME ou TIMESTAMP, 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
DATE
Datas do calendário (ano, mês, dia)
'2025-11-26'
Data / Hora
TIME
Hora do dia (hora, minuto, segundo)
09:30:00, 18:45:30
Data / Hora
DATETIME, TIMESTAMP
Data e hora combinadas
'2025-11-20 14:15:00', '2025-11-21 09:00:00'
Data / Hora
TIMESTAMPTZ
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:
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, BOOL ou BIT, 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
UUID para 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
BOOLEAN, BOOL, BIT
Valores verdadeiros ou falsos
VERDADEIRO, FALSO
Especial / Booleano / Outro
BLOB
Objetos binários grandes (imagens, arquivos)
[dados de imagem binária]
Especial / Booleano / Outro
CLOB
Documentos de texto grandes
Texto completo do contrato...
Especial / Booleano / Outro
JSON
Dados estruturados ou aninhados
'{"name": “Alice”
Especial / Booleano / Outro
ARRAY
Listas de valores (só PostgreSQL)
[1,2,3]
Especial / Booleano / Outro
UUID
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 INT para números inteiros de uso geral
Usa INTEGER para números inteiros
Usa INT para números inteiros
Números decimais/de precisão fixa
Usa DECIMAL(p, s) para valores numéricos precisos
Usa o NUMERIC(p, s) para armazenamento com precisão exata
Usa DECIMAL(p, s) para valores numéricos precisos
Cadeias de texto de comprimento padrão
Usa VARCHAR(n) para texto de comprimento variável
Usa VARCHAR(n) para texto de comprimento variável
Usa VARCHAR(n) para texto de comprimento variável
Armazenamento de texto grande
Usa TEXT para campos de texto longo
Usa TEXT para campos de texto longo
Usa VARCHAR(MAX) para campos de texto longo
Valores booleanos
Armazena valores booleanos como TINYINT(1) (0 ou 1)
Usa valores nativos do BOOLEAN (verdadeiro/falso)
Usa BIT (0 ou 1) para dados do tipo booleano
Chaves primárias com autoincremento
Usa a palavra-chave ` AUTO_INCREMENT `.
Usa SERIAL ou IDENTITY para gerar números inteiros automaticamente.
Usa IDENTITY para gerar números inteiros automaticamente
Sequências de caracteres muito grandes
Usa LONGTEXT para textos super grandes
Permite um tamanho de lista de valores ( VARCHAR ) bem grande, sem limite máximo prático.
Usa VARCHAR(MAX) para textos grandes ou ilimitados
Armazenamento JSON
Suporta JSON para dados JSON estruturados
Suporta tanto JSON (texto) quanto JSONB (otimizado para binário)
Suporta JSON (armazenado como texto)
Armazenamento em matriz
Não suporta tipos de matriz
Suporta ARRAY para armazenar listas em uma coluna
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.
Armazena valores precisos sem problemas de arredondamento de ponto flutuante
Armazene textos curtos ou médios
VARCHAR(n)
Armazenamento eficiente com tamanho previsível e comprimento flexível
Armazene textos longos e não estruturados
TEXT ou CLOB
Feito pra blocos de texto, tipo descrições ou documentos
Armazene só a data ou só a hora
DATE ou TIME
Evita complicações desnecessárias e mostra o verdadeiro significado dos dados.
Armazene valores flexíveis, tipo documentos
JSON ou JSONB
Ó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, oSQL 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.
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.
Se você deseja começar a usar o SQL, nós o ajudamos. Neste tutorial de SQL, apresentaremos as consultas SQL, uma ferramenta poderosa que nos permite trabalhar com os dados armazenados em um banco de dados. Você verá como escrever consultas SQL, aprenderá sobre
Saiba como usar os acionadores SQL para automatizar tarefas, manter a integridade dos dados e melhorar o desempenho do banco de dados. Experimente exemplos práticos como os comandos CREATE, ALTER e DROP no MySQL e no Oracle.
Domine os fundamentos do SQL necessários para os negócios, aprenda a escrever consultas SQL e comece a analisar seus dados usando essa linguagem poderosa.
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:
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.
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
BITem vez deBOOLEAN, e o MySQL trataBOOLEANcomo 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:
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
DECIMALeFLOATsão a mesma coisa. Mas tem uma diferença importante:DECIMALguarda um número exato com um número específico de casas decimais, enquantoFLOATmanté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
INT,SMALLINT,BIGINTNúmeros inteiros de tamanhos diferentes
1, 42, 1000
Numérico
DECIMAL(p,s),NUMERIC(p,s)Valores decimais exatos com precisão fixa
19,99, 250,56
Numérico
FLOAT,DOUBLEValores 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
NCHAReNVARCHAR, 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
CHAR(n)Texto de comprimento fixo
'US', 'CA'
Caractere / String
VARCHAR(n)Texto de comprimento variável
“Alice Johnson”, “Bob Smith”
Caractere / String
TEXTGrandes blocos de texto sem estrutura
“Prefiro contato por e-mail.”, “Preciso de uma cópia da fatura para cada pedido.”
Caractere / String
NCHAR(n),NVARCHAR(n)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:
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, enquantoVARCHAReTEXTpermitem 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
TIMESTAMPTZno 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
DATEDatas do calendário (ano, mês, dia)
'2025-11-26'
Data / Hora
TIMEHora do dia (hora, minuto, segundo)
09:30:00, 18:45:30
Data / Hora
DATETIME,TIMESTAMPData e hora combinadas
'2025-11-20 14:15:00', '2025-11-21 09:00:00'
Data / Hora
TIMESTAMPTZData 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:
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 aninhadosARRAY(só no PostgreSQL) para listasUUIDpara 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
BOOLEAN,BOOL,BITValores verdadeiros ou falsos
VERDADEIRO, FALSO
Especial / Booleano / Outro
BLOBObjetos binários grandes (imagens, arquivos)
[dados de imagem binária]
Especial / Booleano / Outro
CLOBDocumentos de texto grandes
Texto completo do contrato...
Especial / Booleano / Outro
JSONDados estruturados ou aninhados
'{"name": “Alice”
Especial / Booleano / Outro
ARRAYListas de valores (só PostgreSQL)
[1,2,3]
Especial / Booleano / Outro
UUIDIdentificadores ú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
BITpara booleanos eVARCHAR(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
INTpara números inteiros de uso geralUsa
INTEGERpara números inteirosUsa
INTpara números inteirosNúmeros decimais/de precisão fixa
Usa
DECIMAL(p, s)para valores numéricos precisosUsa o
NUMERIC(p, s)para armazenamento com precisão exataUsa
DECIMAL(p, s)para valores numéricos precisosCadeias de texto de comprimento padrão
Usa
VARCHAR(n)para texto de comprimento variávelUsa
VARCHAR(n)para texto de comprimento variávelUsa
VARCHAR(n)para texto de comprimento variávelArmazenamento de texto grande
Usa
TEXTpara campos de texto longoUsa
TEXTpara campos de texto longoUsa
VARCHAR(MAX)para campos de texto longoValores booleanos
Armazena valores booleanos como
TINYINT(1)(0 ou 1)Usa valores nativos do
BOOLEAN(verdadeiro/falso)Usa
BIT(0 ou 1) para dados do tipo booleanoChaves primárias com autoincremento
Usa a palavra-chave `
AUTO_INCREMENT`.Usa
SERIALouIDENTITYpara gerar números inteiros automaticamente.Usa
IDENTITYpara gerar números inteiros automaticamenteSequências de caracteres muito grandes
Usa
LONGTEXTpara textos super grandesPermite um tamanho de lista de valores (
VARCHAR) bem grande, sem limite máximo prático.Usa
VARCHAR(MAX)para textos grandes ou ilimitadosArmazenamento JSON
Suporta
JSONpara dados JSON estruturadosSuporta tanto
JSON(texto) quantoJSONB(otimizado para binário)Suporta
JSON(armazenado como texto)Armazenamento em matriz
Não suporta tipos de matriz
Suporta
ARRAYpara armazenar listas em uma colunaNã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
DECIMALou umFLOAT. 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.DECIMALeNUMERICarmazenam 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
VARCHARe 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
DATEouTIMEem vez deDATETIME. 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)
DECIMALouNUMERICArmazena valores precisos sem problemas de arredondamento de ponto flutuante
Armazene textos curtos ou médios
VARCHAR(n)Armazenamento eficiente com tamanho previsível e comprimento flexível
Armazene textos longos e não estruturados
TEXTouCLOBFeito pra blocos de texto, tipo descrições ou documentos
Armazene só a data ou só a hora
DATEouTIMEEvita complicações desnecessárias e mostra o verdadeiro significado dos dados.
Armazene valores flexíveis, tipo documentos
JSONouJSONBÓ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
DECIMALpara 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.