Django CharField vs TextField

Jon*_*son 274 sql database django storage

CharField()TextField()Django有什么区别?该文件说,CharField()应该用于更小的字符串,TextField()应使用较大的字符串.好的,但是"小"和"大"之间的界线在哪里?引擎盖下发生的事情就是这样的情况?

Cat*_*lus 317

它是RDBMS varchar(或类似)之间的区别- 通常以最大长度指定,并且在性能或存储方面可能更有效 - 和text(或类似)类型 - 这些通常仅受硬编码实现限制(不是数据库架构).

PostgreSQL 9特别指出"这三种类型之间没有性能差异",但AFAIK在MySQL等方面存在一些差异,因此需要牢记这一点.

一个好的经验法则是,CharField当您需要限制最大长度时使用,TextField否则.

这也不是特定于Django的.

  • 相反,如果你使用CharField,那么*必须*具有最大长度 (40认同)
  • 我发现默认情况下使用`TextField`会影响应用的可移植性.Postgres可能没有性能损失,但Oracle会将其存储为"CLOB",它有一些烦恼,就像无法在WHERE语句中使用该字段一样.只是需要考虑的事情. (14认同)
  • 我相信django两者之间真正重要的区别在于视图如何处理该字段。在常规编辑视图中,TextField将呈现为多行可调整大小的输入;而CharField是单行输入。我没有看过TextField的django源代码,但我将假设是否将任何生成的html附加到TextField,那么它很可能会实现一种正确处理多行文本的方法。 (3认同)
  • 还应该考虑在Oracle中,“ CharField”的“ max_length”不能大于2000,否则它会发出“ ORA-00910:指定的长度太长,导致其数据类型错误”。 (2认同)

ren*_*box 33

在某些情况下,它与场的使用方式有关.在某些数据库引擎中,字段差异决定了您在字段中搜索文本的方式(以及是否).CharFields通常用于可搜索的内容,例如,如果要在字符串"one plus two"中搜索"one".由于字符串较短,因此引擎搜索时间较短.TextFields通常不是要搜索(可能是博客的主体),而是意味着要容纳大量的文本.现在大部分都取决于数据库引擎和Postgres一样,没关系.

即使无关紧要,如果你使用ModelForms,你会在表单中获得不同类型的编辑字段.ModelForm将生成一个HTML表单,其大小为CharField的一行文本和TextField的多行.

  • 这是迄今为止最好的解释,因为它提到了如何在表单中生成字段。Charfield 将只是一个单行输入,但 TextField 将是一个可调整大小的多行。当您主要实现通用类视图时,TextField 是有意义的。它适用于描述字段等。我也喜欢 renderbox 如何提到你不想将它用于任何过滤器/搜索。 (2认同)

Sup*_*ova 7

例如,.在下面的模型中添加了2个字段.

description = models.TextField(blank=True, null=True)
title = models.CharField(max_length=64, blank=True, null=True)
Run Code Online (Sandbox Code Playgroud)

下面是应用迁移时执行的mysql查询.


for TextField(description)该字段定义为alongtext

ALTER TABLE `sometable_sometable` ADD COLUMN `description` longtext NULL;
Run Code Online (Sandbox Code Playgroud)

TextField根据字符串类型概述,MySQL 的最大长度为4GB .


for CharField(title)max_length(required)定义为varchar(64)

ALTER TABLE `sometable_sometable` ADD COLUMN `title` varchar(64) NULL;
ALTER TABLE `sometable_sometable` ALTER COLUMN `title` DROP DEFAULT;
Run Code Online (Sandbox Code Playgroud)


Nje*_*rus 6

CharField具有max_length个255字符,但TextField可以容纳多个255字符.使用TextField时,你有一个大的字符串作为输入.很高兴知道当max_length参数传递给TextField它时,它会将长度验证传递给TextArea小部件.

  • “使用 `VARCHAR` 列类型存储的任何字段的 `max_length` 限制为 255 个字符**如果您对该字段使用 unique=True。**”(我的重点。) (3认同)