Django CharField vs TextField
What is the difference between CharField() and TextField() in Django? The documentation says that CharField() should be used for smaller strings and TextField() should be used for larger strings. Okay, but where is the line drawn between "small" and "large"? What's going on under the hood here that makes this the case?
It’s a difference between RDBMS’s
varchar (or similar) — those are usually specified with a maximum length, and might be more efficient in terms of performance or storage — and
text (or similar) types — those are usually limited only by hardcoded implementation limits (not a DB schema).
PostgreSQL 9, specifically, states that “There is no performance difference among these three types”, but AFAIK there are some differences in e.g. MySQL, so this is something to keep in mind.
A good rule of thumb is that you use
CharField when you need to limit the maximum length,
This is not really Django-specific, also.
In some cases it is tied to how the field is used. In some DB engines the field differences determine how (and if) you search for text in the field. CharFields are typically used for things that are searchable, like if you want to search for “one” in the string “one plus two”. Since the strings are shorter they are less time consuming for the engine to search through. TextFields are typically not meant to be searched through (like maybe the body of a blog) but are meant to hold large chunks of text. Now most of this depends on the DB Engine and like in Postgres it does not matter.
Even if it does not matter, if you use ModelForms you get a different type of editing field in the form. The ModelForm will generate an HTML form the size of one line of text for a CharField and multiline for a TextField.
For eg.,. 2 fields are added in a model like below..
description = models.TextField(blank=True, null=True) title = models.CharField(max_length=64, blank=True, null=True)
Below are the mysql queries executed when migrations are applied.
TextField(description) the field is defined as a
ALTER TABLE `sometable_sometable` ADD COLUMN `description` longtext NULL;
The maximum length of
TextField of MySQL is 4GB according to string-type-overview.
CharField(title) the max_length(required) is defined as
ALTER TABLE `sometable_sometable` ADD COLUMN `title` varchar(64) NULL; ALTER TABLE `sometable_sometable` ALTER COLUMN `title` DROP DEFAULT;
CharField has max_length of
255 characters while
TextField can hold more than
255 characters. Use
TextField when you have a large string as input. It is good to know that when the
max_length parameter is passed into a
TextField it passes the length validation to the
I had an strange problem and understood an unpleasant strange difference:
when I get an URL from user as an CharField and then and use it in html a tag by href, it adds that url to my url and that’s not what I want. But when I do it by Textfield it passes just the URL that user entered.
look at these:
my website address:
when clicking on it:
when clicking on it:
I must mention that the URL is saved exactly the same in DB by two ways but I don’t know why result is different when clicking on them
- Database Administration Tutorials
- Programming Tutorials & IT News
- Linux & DevOps World
- Entertainment & General News
- Games & eSport