在Django中,CharField和TextField有什么区别?

408

文档指出应该使用CharField()来处理较短的字符串,而应该使用TextField()来处理较长的字符串。

那么,在“短”和“长”之间如何划分呢?在底层发生了什么使得这种情况成立?

5个回答

484

关于 RDBMS 的数据类型,varchar(或类似类型)通常会指定最大长度,并且在性能或存储方面可能更加高效;而 text(或类似类型)则通常只受硬编码实现限制而不是数据库模式限制。

特别地,PostgreSQL 9 表示“这三种类型没有性能差异”,但据我所知,在 MySQL 中存在一些差异,需要注意。

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

这并不仅是 Django 特有的。


52
相反,如果您使用CharField,则必须具有最大长度。 - Sam Svenbjorgchristiensensen
23
我发现默认使用TextField可能会影响您的应用程序可移植性。在Postgres上可能不会有性能问题,但Oracle将其存储为CLOB,这会带来一些麻烦,比如无法在WHERE语句中使用该字段。只是需要考虑的一些事情。 - serverpunk
7
需要考虑的是,在Oracle中,CharFieldmax_length 不能大于2000,否则会出现 ORA-00910: specified length too long for its datatype 错误。 - Dinei
在考虑字段属性时,值得注意的是,Postgres文档还指出(强调我的):“可以存储的最长字符串约为1 GB。(在数据类型声明中允许的n的最大值小于此值[...]如果您希望存储没有特定上限的长字符串,请使用text或character varying而不是构造任意长度限制。)" - iff_or
8
我认为 Django 中的两个字段之间真正重要的区别是视图如何处理这些字段。在通用编辑视图中,TextField 将呈现为多行可调整大小的输入框;而 CharField 则是单行输入框。我没有查看 TextField 的 Django 源代码,但我假设如果任何生成的 HTML 与 TextField 相关联,那么它很可能会实现一种正确操作多行文本的方式。 - Mitchell Walls

49

有些情况下,这取决于字段的使用方式。在某些数据库引擎中,字段的差异决定了您如何(以及是否)在字段中搜索文本。CharFields通常用于可搜索的项目,比如您想在字符串“one plus two”中搜索“one”。由于字符串较短,搜索引擎需要花费的时间也会更少。TextField通常不用于搜索(例如博客正文),而是用于保存大量文本。现在,大多数情况都取决于数据库引擎,例如在Postgres中它并不重要。

即使它并不重要,如果您使用ModelForms在表单中获取不同类型的编辑字段。ModelForm将为CharField生成一个一行文本大小的HTML表单,对于TextField则生成多行文本大小的表单。


4
这是目前为止最好的解释,因为它提到了如何以一种形式生成字段。CharField只是一行输入,而TextField则可以调整大小并支持多行。当你主要实现通用类视图时,使用TextField会更有意义。对于描述字段等情况,它非常有效。我也喜欢renderbox提到的,不建议将其用于任何筛选/搜索功能。 - Mitchell Walls

16

CharField 最大长度为 255 个字符,而 TextField 可以容纳超过 255 个字符。当输入一个较长的字符串时,请使用 TextField。需要注意的是,当将 max_length 参数传递到 TextField 中时,它会将长度验证传递给 TextArea 组件。


3
如果您为字段使用了unique=True,则存储在VARCHAR列类型中的任何字段都将其max_length限制为255个字符。 - l0b0
这个回答是误导性的。正如@I0b0在上面提到的,255并不是一个固定的最大值。 - Akaisteph7

15

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

description = models.TextField(blank=True, null=True)
title = models.CharField(max_length=64, blank=True, null=True)

应用迁移时执行的 MySQL 查询如下。


对于 TextField(description) 字段,其定义为 longtext 类型。

ALTER TABLE `sometable_sometable` ADD COLUMN `description` longtext NULL;

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


CharField(标题)的max_length(必需)定义为varchar(64)

ALTER TABLE `sometable_sometable` ADD COLUMN `title` varchar(64) NULL;
ALTER TABLE `sometable_sometable` ALTER COLUMN `title` DROP DEFAULT;

1
注意:Django文档建议在CharField和TextField等基于字符串的字段上避免使用null: https://docs.djangoproject.com/en/2.0/ref/models/fields/#null,因此最好保持null=False。 - modulitos

5

TextField 可以包含超过 255 个字符,但 CharField 用于存储较短的字符串。

当需要存储长文本时,请使用 TextField,或者当需要存储较短的字符串时则使用 CharField。

  article_title = models.CharField(max_length=150)
  article_body = models.TextField()

1
这个“答案”说明了问题的背景, 并没有提供有关“何时/为什么”的答案。 - GreenAsJade

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接