Qual é a diferença entre o tipo "varchar" e o "texto" no PostgreSQL?

15

Tudo o que sei sobre as diferenças deles é varchartem limite e textnão é. A documentação não menciona isso.

Essa é realmente a única diferença? Nenhuma consideração sobre desempenho ou etc?

Eonil
fonte
1
Isso realmente deve ser migrado para os administradores de banco de dados . Não tem nada a ver com a administração do servidor.
Evan Carroll

Respostas:

22

O pano de fundo disso é: O antigo sistema Postgres usava a linguagem PostQUEL e usava um tipo de dados chamado text(porque alguém achou que esse era um bom nome para um tipo que armazena texto). Em seguida, o Postgres foi convertido para usar o SQL como idioma. Para obter compatibilidade com o SQL, em vez de renomear o texttipo, um novo tipo varcharfoi adicionado. Mas ambos os tipos usam as mesmas rotinas C internamente.

Agora, até certo ponto e em alguns lugares, texté codificado como um tipo padrão, caso nada mais possa ser derivado. Além disso, a maioria das funções está disponível apenas como textargumento ou retorno text. Os dois tipos são compatíveis com binários, portanto, a conversão é uma operação trivial de tempo de análise. Mas o uso textainda é mais natural para o sistema.

Mas, além desses pontos, não há diferença perceptível. Use o que parecer mais bonito para você. ;-)

Peter Eisentraut
fonte
Oh boa explicação. Usarei 'texto' porque não me importo com a compatibilidade que bloqueia o uso de benefícios de produtos específicos. Obrigado!
Eonil
1

Veja esta pergunta semelhante . O problema é que não há diferença, mas especificar um comprimento máximo como varchar(n)geralmente não é a seu favor, pois ele usa mais espaço, mas não melhora o desempenho.

mandioca
fonte
0

http://www.postgresql.org/docs/8.4/interactive/datatype-character.html

character varying(n), varchar(n)        variable-length with limit
text                                    variable unlimited length

texto sem comprimento declarado. Não há diferenças de desempenho entre esses dois tipos.

ooshro
fonte
5
Você também pode usar varchar sem a parte (), que também terá tamanho ilimitado e, portanto, mais ou menos equivalente ao texto.
27611 Magnus Hagander