文档指出应该使用CharField()
来处理较短的字符串,而应该使用TextField()
来处理较长的字符串。
那么,在“短”和“长”之间如何划分呢?在底层发生了什么使得这种情况成立?
关于 RDBMS 的数据类型,varchar
(或类似类型)通常会指定最大长度,并且在性能或存储方面可能更加高效;而 text
(或类似类型)则通常只受硬编码实现限制而不是数据库模式限制。
特别地,PostgreSQL 9 表示“这三种类型没有性能差异”,但据我所知,在 MySQL 中存在一些差异,需要注意。
一个好的经验法则是,当您需要限制最大长度时,请使用 CharField
;否则请使用 TextField
。
这并不仅是 Django 特有的。
有些情况下,这取决于字段的使用方式。在某些数据库引擎中,字段的差异决定了您如何(以及是否)在字段中搜索文本。CharFields通常用于可搜索的项目,比如您想在字符串“one plus two”中搜索“one”。由于字符串较短,搜索引擎需要花费的时间也会更少。TextField通常不用于搜索(例如博客正文),而是用于保存大量文本。现在,大多数情况都取决于数据库引擎,例如在Postgres中它并不重要。
即使它并不重要,如果您使用ModelForms在表单中获取不同类型的编辑字段。ModelForm将为CharField生成一个一行文本大小的HTML表单,对于TextField则生成多行文本大小的表单。
CharField
最大长度为 255
个字符,而 TextField
可以容纳超过 255
个字符。当输入一个较长的字符串时,请使用 TextField
。需要注意的是,当将 max_length
参数传递到 TextField
中时,它会将长度验证传递给 TextArea
组件。
VARCHAR
列类型中的任何字段都将其max_length
限制为255个字符。 - l0b0255
并不是一个固定的最大值。 - Akaisteph7例如,如下模型中添加了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;
TextField 可以包含超过 255 个字符,但 CharField 用于存储较短的字符串。
当需要存储长文本时,请使用 TextField,或者当需要存储较短的字符串时则使用 CharField。
article_title = models.CharField(max_length=150)
article_body = models.TextField()
TextField
可能会影响您的应用程序可移植性。在Postgres上可能不会有性能问题,但Oracle将其存储为CLOB
,这会带来一些麻烦,比如无法在WHERE语句中使用该字段。只是需要考虑的一些事情。 - serverpunkCharField
的max_length
不能大于2000,否则会出现ORA-00910: specified length too long for its datatype
错误。 - Dinei