Não há diferença, por baixo do capô é tudo varlena
( matriz de comprimento variável ).
Verifique este artigo da Depesz: http://www.depesz.com/index.php/2010/03/02/charx-vs-varcharx-vs-varchar-vs-text/
Alguns destaques:
Para resumir tudo:
- char (n) - ocupa muito espaço ao lidar com valores menores que
n
(preenche-os n
) e pode levar a erros sutis devido à adição de espaços finais, além de ser problemático alterar o limite
- varchar (n) - é problemático alterar o limite no ambiente ativo (requer bloqueio exclusivo ao alterar a tabela)
- varchar - assim como o texto
- texto - para mim um vencedor - sobre (n) tipos de dados porque não possui problemas e sobre varchar - porque possui um nome distinto
O artigo faz testes detalhados para mostrar que o desempenho das inserções e seleções para todos os quatro tipos de dados é semelhante. Ele também analisa detalhadamente maneiras alternativas de restringir o comprimento quando necessário. Restrições ou domínios baseados em funções fornecem a vantagem do aumento instantâneo da restrição de comprimento e, com base no fato de que diminuir uma restrição de comprimento de sequência é raro, depesz conclui que uma delas geralmente é a melhor opção para um limite de comprimento.
Como " tipos de caracteres " nos pontos de documentação para fora,
varchar(n)
,char(n)
, etext
são armazenados da mesma maneira. A única diferença é que são necessários ciclos extras para verificar o comprimento, se houver, e o espaço e tempo extras necessários para o preenchimentochar(n)
.No entanto, quando você só precisa armazenar um único caractere, há uma pequena vantagem de desempenho em usar o tipo especial
"char"
(mantenha as aspas duplas - elas fazem parte do nome do tipo). Você obtém acesso mais rápido ao campo e não há sobrecarga para armazenar o comprimento.Acabei de criar uma tabela de 1.000.000 de caracteres aleatórios
"char"
escolhidos no alfabeto minúsculo. Uma consulta para obter uma distribuição de frequência (select count(*), field ... group by field
) leva cerca de 650 milissegundos, contra cerca de 760 nos mesmos dados usando umtext
campo.fonte
"char"
não échar
?? Atualmente é válido no PostgreSQL 11+? ... Sim: "O tipo"char"
(observe as aspas) é diferente de char (1), pois usa apenas um byte de armazenamento. Ele é usado internamente nos catálogos do sistema como um tipo de enumeração simplista ." , guia / tipo de dados caractere .ATUALIZAÇÃO DE BENCHMARKS PARA 2016 (pág. 9.5 +)
E usando benchmarks "puro SQL" (sem nenhum script externo)
use qualquer string_generator com UTF8
principais benchmarks:
2.1 INSERIR
2.2 SELECIONAR comparando e contando
Preparar teste específico (exemplos)
Execute um teste básico:
E outros testes,
... E use
EXPLAIN ANALYZE
.ATUALIZADO NOVAMENTE 2018 (página 10)
pouca edição para adicionar os resultados de 2018 e reforçar as recomendações.
Resultados em 2016 e 2018
Meus resultados, depois da média, em muitas máquinas e muitos testes: todos iguais
(estatisticamente menos do que o desvio padrão).
Recomendação
Use o
text
tipo de dados,evite o antigo,
varchar(x)
porque às vezes não é um padrão, por exemplo, nasCREATE FUNCTION
cláusulasvarchar(x)
≠varchar(y)
.expressar limites (com o mesmo
varchar
desempenho!) por comCHECK
cláusula noCREATE TABLE
eg
CHECK(char_length(x)<=10)
.Com uma perda insignificante de desempenho em INSERT / UPDATE, você também pode controlar intervalos e estrutura de cadeias,
por exemplo
CHECK(char_length(x)>5 AND char_length(x)<=20 AND x LIKE 'Hello%')
fonte
"char"
, que não échar
, mesmo nos dias atuais do PostgreSQL 11+. Como o caractere de guia / tipo de dados diz "O tipo"char"
(observe as aspas) é diferente de char (1), pois usa apenas um byte de armazenamento. Ele é usado internamente nos catálogos do sistema como um tipo de enumeração simplista ". .No manual do PostgreSQL
Eu costumo usar texto
Referências: http://www.postgresql.org/docs/current/static/datatype-character.html
fonte
Na minha opinião,
varchar(n)
tem suas próprias vantagens. Sim, todos eles usam o mesmo tipo subjacente e tudo isso. Porém, deve-se ressaltar que os índices no PostgreSQL têm seu limite de tamanho de 2712 bytes por linha.TL; DR: Se você usar o
text
tipo sem restrição e tiver índices nessas colunas, é muito possível que você atinja esse limite para algumas de suas colunas e receba um erro ao tentar inserir dados, mas com o usovarchar(n)
, poderá evitá-lo.Mais alguns detalhes: O problema aqui é que o PostgreSQL não oferece nenhuma exceção ao criar índices para o
text
tipo ouvarchar(n)
onden
é maior que 2712. No entanto, ocorrerá um erro ao tentar inserir um registro com tamanho compactado maior que 2712. Isso significa que você pode inserir 100.000 caracteres da sequência, que é composta por caracteres repetitivos facilmente, porque será compactada muito abaixo de 2712, mas talvez não seja possível inserir uma sequência com 4000 caracteres, porque o tamanho compactado é maior que 2712 bytes. Usandovarchar(n)
onden
não é muito maior que 2712, você está seguro contra esses erros.fonte
text e varchar têm diferentes conversões implícitas de tipo. O maior impacto que notei é a manipulação de espaços à direita. Por exemplo ...
retorna
true, false, true
e nãotrue, true, true
como você poderia esperar.fonte
Um pouco OT: se você estiver usando o Rails, a formatação padrão das páginas da web pode ser diferente. Para formulários de entrada de dados, as
text
caixas podem ser roladas, mas as caixascharacter varying
(Railsstring
) são de uma linha. As exibições de exibição duram o necessário.fonte
Uma boa explicação de http://www.sqlines.com/postgresql/datatypes/text :
fonte
character varying(n)
,varchar(n)
- (Ambos iguais). o valor será truncado para n caracteres sem gerar um erro.character(n)
,char(n)
- (Ambos iguais). comprimento fixo e preenchido com espaços em branco até o final do comprimento.text
- comprimento ilimitado.Exemplo:
Nós obtemos os resultados:
fonte