Quando a gente fala de trabalhar com dados de texto no PostgreSQL, temos três personagens principais: CHAR, VARCHAR e TEXT. Cada um tem suas particularidades, vantagens e pegadinhas. Bora entender cada um deles.
CHAR(n)
CHAR, ou character, é uma string de tamanho fixo n. Se a string tiver menos caracteres do que o especificado, ela é completada automaticamente com espaços.
Exemplo:
| id | código - CHAR(5) |
|---|---|
| 1 | ''ABC'' |
Esse tipo é massa quando todas as strings precisam ter o mesmo tamanho (tipo códigos, códigos de barras ou identificadores de tamanho fixo).
Mas se você for trabalhar com texto de tamanho variável, esses espaços extras só vão ocupar espaço à toa no banco.
VARCHAR(n)
VARCHAR, ou variable character, serve pra guardar strings de tamanho variável, mas com um limite máximo de n caracteres.
Exemplo:
| id | username - VARCHAR(10) |
|---|---|
| 1 | ''Alice'' |
Esse tipo usa o espaço de forma eficiente, porque só salva o texto real. O lado ruim é que você tem que definir o limite de tamanho. Se a string passar desse limite, o banco vai dar erro.
TEXT
TEXT é um tipo de dado textual que não tem limite de tamanho. Ele é muito usado quando você não faz ideia de até onde o texto pode crescer.
Exemplo:
| id | conteúdo - TEXT |
|---|---|
| 1 | ''This is a long piece of text. No limits!'' |
Vantagens: dá pra guardar textos de qualquer tamanho, sem se preocupar com limites.
Desvantagens: sem limites, pode acabar usando espaço demais no banco se os textos começarem a ficar gigantes.
Comparando os tipos de dados de texto
Quando você mexe com texto, é importante sacar qual tipo de dado é melhor pra cada situação. Olha só as principais diferenças entre CHAR, VARCHAR e TEXT:
| Tipo de dado | Tamanho | Performance | Quando usar? |
|---|---|---|---|
CHAR(n) |
Fixo | Mais rápido pra strings de tamanho fixo | Pra códigos de tamanho fixo (tipo ISO) |
VARCHAR(n) |
Tamanho máximo n |
Mais rápido que TEXT quando tem limite |
Pra strings de tamanho variável com limite conhecido |
TEXT |
Ilimitado | O mais versátil | Pra textos longos, quando não dá pra prever o tamanho |
Exemplos práticos de uso
Agora bora ver como usar esses tipos de dados em situações reais.
Exemplo 1: Usando CHAR pra códigos de tamanho fixo
Imagina que você tá mexendo num banco de dados onde precisa guardar códigos de cidades seguindo o padrão ISO 3166-1 alpha-3. Cada código tem que ter exatamente 3 caracteres.
| city_id | city_name - VARCHAR(50) | iso_code - CHAR(3) |
|---|---|---|
| 1 | New York | NYC |
| 2 | Los Angeles | LAX |
| 3 | Chicago | CHI |
Aqui o CHAR(3) é perfeito, porque cada código ISO da cidade tem tamanho fixo.
Exemplo 2: Usando VARCHAR pra nomes de usuário
Nome de usuário é um ótimo caso pra VARCHAR. Normalmente o nome tem tamanho variável, mas dá pra supor que nunca vai passar de 50 caracteres.
| user_id | username - VARCHAR(50) | email - VARCHAR(50) |
|---|---|---|
| 1 | Alice | alice@example.com |
| 2 | Bob | bob@example.net |
VARCHAR nesse caso economiza espaço, já que o tamanho real da string pode ser menor que 50 caracteres.
Exemplo 3: Usando TEXT pra guardar descrições
Imagina que você tem um blog, e pra cada post precisa guardar uma descrição grandona. Aqui o melhor é usar TEXT.
| post_id | title - VARCHAR(100) | content - TEXT |
|---|---|---|
| 1 | Post 1 | This is a very long blog post content that goes on and on... |
Se você nunca sabe o tamanho do texto de antemão, TEXT é a escolha certa.
4. Outros detalhes e pegadinhas
Quando você mexe com tipos de dados de texto, tem uns detalhes que vale a pena ficar ligado pra não cair em cilada.
Problema: CHAR adiciona espaços
Se você tentar comparar strings num campo CHAR sem considerar os espaços adicionados, pode acabar tendo resultados estranhos.
SELECT * FROM cities WHERE iso_code = 'NYC';
-- Não retorna nada se não tirar os espaços
Como resolver: Usa a função TRIM() pra remover os espaços.
SELECT * FROM cities WHERE TRIM(iso_code) = 'NYC';
Problema: Limite de tamanho no VARCHAR pode dar erro
Se você tentar inserir numa coluna VARCHAR uma string maior que o limite, o banco vai dar erro.
INSERT INTO users (username, email) VALUES ('A_username_that_is_too_long_for_field', 'test@example.com');
-- Erro
Como resolver: Garante que o limite de tamanho (n) faz sentido pro seu caso. Ou usa TEXT pra não ter limite.
Problema: TEXT pode engordar seu banco
TEXT guarda dados sem limite, o que pode fazer as tabelas crescerem demais e dificultar a indexação.
Como evitar: Se você pretende indexar muito uma coluna TEXT, pensa em usar um VARCHAR limitado.
GO TO FULL VERSION