documentation 表示 CharField()
应该用于较小的字符串,而 TextField()
应该用于较大的字符串。
好的,但是“小”和“大”之间的界限在哪里?这里的引擎盖下发生了什么?
这是 RDBMS 的 varchar
(或类似)类型之间的区别——它们通常指定最大长度,并且在性能或存储方面可能更有效——和 text
(或类似)类型——它们通常仅受以下限制硬编码的实现限制(不是数据库模式)。
具体来说,PostgreSQL 9 声明了 "There is no performance difference among these three types",但是 AFAIK 在例如 MySQL 中存在一些差异,因此需要牢记这一点。
一个好的经验法则是,当您需要限制最大长度时使用 CharField
,否则使用 TextField
。
这也不是真正的 Django 特定的。
在某些情况下,它与该字段的使用方式有关。在某些数据库引擎中,字段差异决定了您如何(以及是否)在字段中搜索文本。 CharFields 通常用于可搜索的内容,例如如果您想在字符串“一加二”中搜索“一”。由于字符串更短,因此引擎搜索所需的时间更少。 TextFields 通常不是用来搜索的(比如可能是博客的正文),而是用来保存大块文本。现在大部分依赖于数据库引擎,就像在 Postgres 中一样,这并不重要。
即使没关系,如果您使用 ModelForms,您会在表单中获得不同类型的编辑字段。 ModelForm 将生成一个 HTML 表单,其大小为 CharField 的一行文本和 TextField 的多行文本。
CharField
的最大长度为 255
个字符,而 TextField
可以容纳超过 255
个字符。当您有一个大字符串作为输入时使用 TextField
。很高兴知道,当 max_length
参数传递到 TextField
时,它会将长度验证传递给 TextArea
小部件。
VARCHAR
列类型存储的任何字段都将其 max_length
限制为 255 个字符如果您对该字段使用 unique=True。”(我的重点。)
例如,。在如下模型中添加了 2 个字段..
description = models.TextField(blank=True, null=True)
title = models.CharField(max_length=64, blank=True, null=True)
以下是应用迁移时执行的 mysql 查询。
对于 TextField
(描述),该字段被定义为 longtext
ALTER TABLE `sometable_sometable` ADD COLUMN `description` longtext NULL;
根据string-type-overview,MySQL 的TextField
的最大长度为 4GB。
对于 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;
Avoid using null on string-based fields such as CharField and TextField
:docs.djangoproject.com/en/2.0/ref/models/fields/#null,所以最好保留 null=False
。
TextField 可以包含超过 255 个字符,但 CharField 用于存储较短长度的字符串。
当您想要存储长文本时,使用 TextField,或者当您想要较短的字符串时,CharField 很有用。
article_title = models.CharField(max_length=150)
article_body = models.TextField()
TextField
会影响应用程序的可移植性。 Postgres 可能不会对性能造成影响,但 Oracle 会将其存储为CLOB
,这会带来一些麻烦,例如无法在 WHERE 语句中使用该字段。只是需要考虑的事情。CharField
的max_length
不能大于 2000,否则会发出ORA-00910: specified length too long for its datatype
错误。