É uma diferença entre os RDBMSs varchar
(ou similares) - geralmente são especificados com um comprimento máximo e podem ser mais eficientes em termos de desempenho ou armazenamento - e text
(ou similares) tipos - geralmente são limitados apenas por limites de implementação codificados (não um Esquema do banco de dados).
O PostgreSQL 9, especificamente, afirma que "Não há diferença de desempenho entre esses três tipos" , mas no AFAIK existem algumas diferenças, por exemplo, no MySQL, então isso é algo a ser lembrado.
Uma boa regra é que você use CharField
quando precisar limitar o comprimento máximo, TextField
caso contrário.
Isso também não é realmente específico do Django.
TextField
por padrão pode afetar a portabilidade do seu aplicativo. Pode não haver um impacto no desempenho no Postgres, mas o Oracle o armazenará como algoCLOB
que tem alguns aborrecimentos, como não poder usar o campo nas instruções WHERE. Apenas algo a considerar.CharField
não pode termax_length
mais que 2000 ou emite umORA-00910: specified length too long for its datatype
erro.Em alguns casos, está vinculado à forma como o campo é usado. Em alguns mecanismos de banco de dados, as diferenças de campo determinam como (e se) você procura texto no campo. Os CharFields geralmente são usados para itens pesquisáveis, como se você deseja procurar "um" na sequência "um mais dois". Como as seqüências de caracteres são mais curtas, elas consomem menos tempo para o mecanismo pesquisar. Os TextFields normalmente não devem ser pesquisados (como talvez o corpo de um blog), mas devem conter grandes quantidades de texto. Agora, a maior parte disso depende do DB Engine e, como no Postgres, isso não importa.
Mesmo que isso não importe, se você usa ModelForms, obtém um tipo diferente de campo de edição no formulário. O ModelForm irá gerar um formulário HTML do tamanho de uma linha de texto para um CharField e multilinha para um TextField.
fonte
Por exemplo,. 2 campos são adicionados em um modelo como abaixo.
Abaixo estão as consultas mysql executadas quando as migrações são aplicadas.
para
TextField
(descrição) o campo é definido como umlongtext
O tamanho máximo
TextField
do MySQL é de 4 GB, de acordo com a visão geral do tipo string .para
CharField
(title) o max_length (obrigatório) é definido comovarchar(64)
fonte
Avoid using null on string-based fields such as CharField and TextField
:: docs.djangoproject.com/en/2.0/ref/models/fields/#null, portanto é melhor mantê-lonull=False
.CharField
tem max_length de255
caracteres enquantoTextField
pode conter mais que255
caracteres. UseTextField
quando você tiver uma string grande como entrada. É bom saber que quando omax_length
parâmetro é passado para umTextField
passa a validação de comprimento para oTextArea
widget.fonte
VARCHAR
tipos de coluna têm seumax_length
limite restrito a 255 caracteres se você estiver usando unique = True para o campo. " (Ênfase meu.)Eu tive um problema estranho e entendi uma diferença estranha desagradável: quando recebo um URL do usuário como um CharField e o uso em html uma tag por href, ele adiciona esse URL ao meu URL e não é isso que eu quero. Mas quando eu faço isso pelo Textfield, ele passa apenas a URL que o usuário digitou. veja estes: endereço do meu site:
http://myweb.com
Entrada do CharField:
http://some-address.com
ao clicar nele:
http://myweb.comhttp://some-address.com
Entrada do TextField:
http://some-address.com
ao clicar nele:
http://some-address.com
Devo mencionar que a URL é salva exatamente da mesma forma no DB de duas maneiras, mas não sei por que o resultado é diferente ao clicar nelas.
fonte