Answers:
RDBMS varchar
(或类似的数据库)之间的区别是-通常以最大长度来指定,并且在性能或存储方面可能更为有效-和text
(或类似的)类型-这些通常仅受硬编码实现限制(而不是数据库架构)。
PostgreSQL 9特别指出“这三种类型之间没有性能差异”,但是AFAIK在MySQL等方面有一些差异,因此请记住这一点。
一个好的经验法则是,CharField
在需要限制最大长度时使用,TextField
否则。
这也不是真的特定于Django。
TextField
默认情况下使用会影响应用程序的可移植性。Postgres可能不会对性能造成影响,但是Oracle会将它存储为CLOB
有一些烦人的内容,例如无法在WHERE语句中使用该字段。只是要考虑的事情。
CharField
中不能max_length
超过2000,否则会发出ORA-00910: specified length too long for its datatype
错误。
在某些情况下,它与字段的使用方式有关。在某些数据库引擎中,字段差异决定了如何(以及是否)在字段中搜索文本。CharFields通常用于可搜索的内容,例如,如果您要在字符串“一加二”中搜索“一”。由于字符串较短,因此引擎搜索所需的时间更少。TextField通常不是要被搜索(例如博客的正文),而是要容纳大块文本。现在,大多数情况取决于数据库引擎,就像在Postgres中一样,这无关紧要。
即使没有关系,如果您使用ModelForms,您也会在表单中获得不同类型的编辑字段。ModelForm将生成一个HTML表单,该表单的大小对于CharField来说是一行文本,对于TextField是多行。
例如。如下模型中添加了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;
TextField
根据字符串类型概述,MySQL 的最大长度为4GB。
for 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
。
CharField
的255
字符数上限为max_length个,但TextField
可以容纳多个255
字符。使用TextField
时,你有一个大的字符串作为输入。很高兴知道,当max_length
参数传递给a时,TextField
它将长度验证传递给TextArea
小部件。
VARCHAR
列类型一起存储的字段都将max_length
限制为255个字符。 ”(我的强调。)
我遇到了一个奇怪的问题,并理解了一个令人不愉快的奇怪区别:当我从用户那里获取一个URL作为CharField,然后在href标记中的html中使用它时,它将该URL 添加到了我的URL中,这不是我想要的。但是当我通过Textfield进行操作时,它只是通过了用户输入的URL。看这些:我的网站地址:http://myweb.com
CharField entery: http://some-address.com
单击时: http://myweb.comhttp://some-address.com
TextField输入法: http://some-address.com
单击时: http://some-address.com
不得不提的是,URL保存完全一样通过两种方式在DB,但我不知道为什么他们点击时的结果是不同的