Concordo com tudo o que foi dito por a_horse_with_no_name, e geralmente concordo com os conselhos de comentários de Erwin:
Não, char é inferior (e desatualizado). text e varchar executam (quase) o mesmo.
Metadados
Com uma pequena exceção, a única vez que uso char()
é quando quero que os metadados digam que DEVE ter caracteres x. Embora eu saiba que char()
apenas reclame se a entrada estiver acima do limite, frequentemente protegerei contra subidas devido a uma CHECK
restrição. Por exemplo,
CREATE TABLE foo (
x char(10) CHECK ( length(x) = 10 )
);
INSERT INTO foo VALUES (repeat('x', 9));
Eu 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 um idioma otimizado para cadeias de largura fixa.
- Estabelece uma convenção que faz sentido e é facilmente aplicada. Eu posso escrever um carregador de esquema em um idioma para gerar código a partir desta convenção.
Preciso de um exemplo de onde eu possa fazer isso,
- Abreviações de estado de duas letras, embora, como essa lista possa ser enumerada, eu normalmente o faça com um
ENUM
.
- Números de identificação do veículo
- Números de modelo (de tamanho fixo)
Sobre erros
Observe que algumas pessoas podem se sentir desconfortáveis com a incongruência das mensagens de erro nos dois lados do limite, mas isso não me incomoda
test=# INSERT INTO foo VALUES (repeat('x', 9));
ERROR: new row for relation "foo" violates check constraint "foo_x_check"
DETAIL: Failing row contains (xxxxxxxxx ).
test=# INSERT INTO foo VALUES (repeat('x', 11));
ERROR: value too long for type character(10)
Contraste com varchar
Além disso, acho que a sugestão acima se encaixa muito bem com uma convenção de quase sempre usotext
. Você pergunta sobre varchar(n)
também. Eu nunca uso isso . Pelo menos, não me lembro da última vez que usei varchar(n)
.
- Se uma especificação tem um campo de largura estática em que eu confio, eu uso
char(n)
,
- Caso contrário, eu uso o
text
que é efetivamente varchar
(sem limite)
Se eu encontrasse uma especificação que tivesse chaves de texto de comprimento variável que fossem significativas e que eu confiasse em ter um comprimento máximo constante, eu usaria varchar(n)
também . No entanto, não consigo pensar em nada que se encaixe nesse critério.
Notas Adicionais
Perguntas e Respostas relacionadas: