【发布时间】:2011-11-13 08:26:47
【问题描述】:
documentation 表示 CharField() 应该用于较小的字符串,TextField() 应该用于较大的字符串。
好的,但是“小”和“大”之间的界限在哪里?导致这种情况的幕后原因是什么?
【问题讨论】:
标签: sql django database storage
documentation 表示 CharField() 应该用于较小的字符串,TextField() 应该用于较大的字符串。
好的,但是“小”和“大”之间的界限在哪里?导致这种情况的幕后原因是什么?
【问题讨论】:
标签: sql django database storage
这是 RDBMS 的 varchar(或类似)类型之间的区别——它们通常指定最大长度,并且在性能或存储方面可能更有效——和 text(或类似)类型——通常是仅受硬编码实现限制(不是 DB 模式)的限制。
PostgreSQL 9 明确指出 "There is no performance difference among these three types",但 AFAIK 存在一些差异,例如MySQL,所以要记住这一点。
一个好的经验法则是,当您需要限制最大长度时使用CharField,否则使用TextField。
这也不是真正的 Django 特定的。
【讨论】:
TextField 会影响应用的可移植性。 Postgres 的性能可能不会受到影响,但 Oracle 会将其存储为 CLOB,这会带来一些烦恼,例如无法在 WHERE 语句中使用该字段。只是需要考虑的事情。
CharField 的 max_length 不能大于 2000,否则会发出 ORA-00910: specified length too long for its datatype 错误。
在某些情况下,它与字段的使用方式有关。在某些数据库引擎中,字段差异决定了您如何(以及是否)在字段中搜索文本。 CharFields 通常用于可搜索的内容,例如如果您想在字符串“一加二”中搜索“一”。由于字符串更短,因此引擎搜索所需的时间更少。 TextFields 通常不是用来搜索的(比如可能是博客的正文),而是用来保存大块文本。现在大部分依赖于数据库引擎,就像在 Postgres 中一样,这并不重要。
即使没有关系,如果您使用 ModelForms,您会在表单中获得不同类型的编辑字段。 ModelForm 将生成一个 HTML 表单,其大小为 CharField 的一行文本和 TextField 的多行文本。
【讨论】:
CharField 的 max_length 为 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()
【讨论】: