I have two fields: one to store an excerpt
with a max size of 500 characters, and another to store a description
with a max size of 10,000 characters.
What data types should I use, TEXT
or VARCHAR
? And why?
After MySQL 5.0.3 VARCHAR accepts ~65000 characters. But this does not tell why I should use one type and or the other.
I'm reasoning that I should use VARCHAR
for the excerpt because I can assign a size limit, and TEXT
for the description
field as it's larger.
A long
VARCHAR
is stored in the same manner as aTEXT
/BLOB
field inInnoDB
(which I assume you're using for transactionality, referential integrity and crash recovery, right?) - that is, externally to the rest of the table on disk (which may require another disk read to retrieve).source
Unless you need to index these columns (in which case
VARCHAR
is much faster) there is no reason to useVARCHAR
overTEXT
for long fields - there are some engine specific optimisations inMySQL
to tune the data retrieval according to length, and you should use the correct column type to take advantage of these.In case you're using
MyISAM
an in-depth discussion on the topic is here.If your content fits in a varchar column then use varchar.
Varchar data is stored in each row. Text data is stored as blobs outside of the table.
According to this test, varchar is about three times faster than text.
One difference between
VARCHAR
andTEXT
is that you can declare aDEFAULT
clause for aVARCHAR
column, but not for aTEXT
column.@Andy is correct that InnoDB stores both
VARCHAR
andTEXT
in the same way internally.FULLTEXT
indexes are supported on bothVARCHAR
andTEXT
. Prior to 5.6, you must use MyISAM to get that type of index. In MySQL 5.6, it finally supportsFULLTEXT
in InnoDB. Though you should test it carefully, because it seems to return different results than the implementation in MyISAM.However, Sphinx Search is faster and richer in features than either implementation in MySQL. See my overview in Full-Text Search Throwdown.
@Mohammed asked:
If you declare a length of up to 255 bytes, it can encode the length of a given string using one byte. If you declare the column max length over 255 bytes, it will use two bytes to encode the length.
You can declare a column as
LONG VARCHAR
, but this is really just an alias for MEDIUMTEXT.