Django CharField vs TextField

时间:2011-09-08 21:13:48

标签: sql django database storage

Django中CharField()TextField()之间有什么区别? documentation表示CharField()应该用于较小的字符串,TextField()应该用于较大的字符串。好的,但是“小”和“大”之间的界线在哪里?引擎盖下发生的事情就是这样的情况?

6 个答案:

答案 0 :(得分:293)

RDBMS的varchar(或类似的)之间存在差异 - 通常使用最大长度指定,并且在性能或存储方面可能更有效 - 以及text(或类似)类型 - 这些通常仅受硬编码实现限制(不是数据库模式)的限制。

PostgreSQL 9,具体而言,表示"There is no performance difference among these three types",但AFAIK在例如MySQL,所以请记住这一点。

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

这也不是特定于Django的。

答案 1 :(得分:31)

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

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

答案 2 :(得分:7)

例如,。在下面的模型中添加了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(标题),max_length(必需)定义为varchar(64)

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

答案 3 :(得分:6)

CharField的最大长度为255个字符,而TextField的字符数可能超过255个字符。如果输入大字符串,请使用TextField。很高兴知道当max_length参数传递到TextField时,它会将长度验证传递给TextArea小部件。

答案 4 :(得分:1)

TextField 可以包含 255 个以上的字符,但 CharField 的最大长度为 255 个字符。

当你想存储长文本时,使用 TextField,或者当你想指定文本的最大长度时,CharField 很有用。

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

答案 5 :(得分:-1)

我遇到了一个奇怪的问题,并且理解了一个令人不愉快的奇怪区别: 当我从用户那里以 CharField 的形式获取URL,然后在href标记中的html标记中使用该URL时,会将该URL 添加到我的URL中,这不是我想要的。但是,当我通过 Textfield 执行此操作时,它会通过 just 用户输入的URL。 看看这些: 我的网站地址:Bag<Cat>

CharField entery:http://myweb.com

点击时:http://some-address.com

TextField entery:http://myweb.comhttp://some-address.com

点击时:http://some-address.com

我必须提到,URL通过两种方式与数据库中的相同完全相同,但是我不知道为什么单击它们时结果会有所不同