Nesta resposta ( https://stackoverflow.com/questions/517579/strings-as-primary-keys-in-sql-database ) uma única observação chamou minha atenção:
Lembre-se também de que geralmente há uma diferença muito grande entre um CHAR e um VARCHAR ao fazer comparações de índice
Isso se aplica/ainda se aplica ao Postgres?
Encontrei páginas no Oracle alegando que CHAR
é mais ou menos um alias para VARCHAR
e, portanto, o desempenho do índice é o mesmo, mas não encontrei nada definitivo no Postgres.
CHAR
eVARCHAR
são implementados exatamente da mesma forma no Postgres (e Oracle). Não há diferença na velocidade ao usar esses tipos de dados.No entanto, há uma diferença que pode fazer a diferença no desempenho: uma
char
coluna é sempre preenchida com o comprimento definido. Portanto, se você definir uma coluna comochar(100)
e uma como,varchar(100)
mas armazenar apenas 10 caracteres em cada uma, achar(100)
coluna usará 100 caracteres para cada valor (os 10 caracteres que você armazenou, mais 90 espaços), enquanto avarchar
coluna armazena apenas 10 caracteres.Comparar 100 caracteres com 100 caracteres será mais lento do que comparar 10 caracteres com 10 caracteres - embora eu duvide que você possa realmente medir essa diferença em uma consulta SQL.
Se você declarar ambos com o comprimento de 10 caracteres e sempre armazenar exatamente 10 caracteres neles, não haverá absolutamente nenhuma diferença (isso é verdade para Oracle e Postgres)
Portanto, a única diferença é o preenchimento que é feito para o
char
tipo de dados.A citação acima só é verdadeira se (e somente se) a
char
coluna for definida muito larga (ou seja, você está desperdiçando espaço devido ao preenchimento). Se o comprimento dachar
coluna é sempre usado completamente (portanto, não ocorre preenchimento), a citação acima está errada (pelo menos para Postgres e Oracle)Do meu ponto de vista, o
char
tipo de dados realmente não tem nenhum uso de palavra real. Basta usarvarchar
(outext
no Postgres) e esquecer quechar
existe.Concordo com tudo o que foi dito por a_horse_with_no_name e geralmente concordo com o conselho de comentário de Erwin:
Metadados
Com uma pequena exceção, a única vez que uso
char()
é quando quero que os metadados digam que isso DEVE ter caracteres x. Embora eu saiba quechar()
só reclama se a entrada estiver acima do limite, frequentemente protejo contra underruns em umaCHECK
restrição. Por exemplo,Faço isso por alguns motivos,
char(x)
às vezes é inferido com carregadores de esquema como sendo uma coluna de largura fixa. Isso pode fazer a diferença em uma linguagem otimizada para strings de largura fixa.Preciso de um exemplo de onde posso fazer isso,
ENUM
.Sobre erros
Observe que algumas pessoas podem se sentir desconfortáveis com a incongruência das mensagens de erro em ambos os lados do limite, mas isso não me incomoda
Contraste com
varchar
Além disso, acho que a sugestão acima se encaixa muito bem com uma convenção de quase sempre usar
text
. Você pergunta sobrevarchar(n)
também. Eu nunca uso isso . Pelo menos, não me lembro da última vez que useivarchar(n)
.char(n)
,text
qual é efetivamentevarchar
(sem limite)Se eu encontrasse uma especificação que tivesse chaves de texto de comprimento variável que fossem significativas e que eu confiasse para ter um comprimento máximo constante, eu também usaria
varchar(n)
. No entanto, não consigo pensar em nada que se encaixe nesses critérios.Notas Adicionais
char
aqui não deve ser confundido com"char"
o que é um tipo de um byte e tem desempenho sólido e benefícios de economia de espaço.Perguntas e respostas relacionadas:
Postgresql
Oráculo
O Postgresql não preencheu com espaços.
Achei isso mais útil e uma explicação rápida de 3 linhas: