TL;DR
TEXT
- фиксиран максимален размер от 65535 знака (не можете да ограничите максималния размер)
- отнема 2 +
c
байтове дисково пространство, къдетоc
е дължината на съхранения низ. - не може да бъде (напълно) част от индекс. Ще трябва да посочите дължина на префикса.
VARCHAR(M)
- променлив максимален размер на
M
символи M
трябва да бъде между 1 и 65535- заема 1 +
c
байтове (заM
≤ 255) или 2 +c
(за 256 ≤M
≤ 65535) байта дисково пространство, къдетоc
е дължината на съхранения низ - може да бъде част от индекс
Още подробности
TEXT
има фикснат максимален размер на 2¹⁶-1 = 65535
символи.VARCHAR
има променлива максимален размер M
до M = 2¹⁶-1
.
Така че не можете да изберете размера на TEXT
но можете за VARCHAR
.
Другата разлика е, че не можете да поставите индекс (освен индекс на пълен текст) върху TEXT
колона.
Така че, ако искате да имате индекс в колоната, трябва да използвате VARCHAR
. Но имайте предвид, че дължината на индекса също е ограничена, така че ако вашият VARCHAR
колоната е твърде дълга, трябва да използвате само първите няколко знака от VARCHAR
колона във вашия индекс (Вижте документацията за CREATE INDEX
).
Но вие също искате да използвате VARCHAR
, ако знаете, че максималната дължина на възможния входен низ е само M
, напр. телефонен номер или име или нещо подобно. След това можете да използвате VARCHAR(30)
вместо TINYTEXT
или TEXT
и ако някой се опита да запази текста и на трите книги "Властелинът на пръстена" в колоната за телефонен номер, вие съхранявате само първите 30 знака :)
Редактиране: Ако текстът, който искате да съхраните в базата данни, е по-дълъг от 65535 знака, трябва да изберете MEDIUMTEXT
или LONGTEXT
, но внимавайте:MEDIUMTEXT
съхранява низове до 16 MB, LONGTEXT
до 4 GB. Ако използвате LONGTEXT
и вземете данните чрез PHP (поне ако използвате mysqli
без store_result
), може би ще получите грешка при разпределението на паметта, защото PHP се опитва да разпредели 4 GB памет, за да е сигурен, че целият низ може да бъде буфериран. Това може би се случва и на други езици освен PHP.
Въпреки това трябва давинагите проверете въвеждането (Твърде дълго ли е? Съдържа ли странен код?) преди съхранявайки го в базата данни.
Забележка:И за двата типа необходимото дисково пространство зависи само от дължината на съхранения низ, а не от максималната дължина.
Напр. ако използвате набора от знаци latin1 и съхранявате текста "Test" в VARCHAR(30)
, VARCHAR(100)
и TINYTEXT
, винаги изисква 5 байта (1 байт за съхраняване на дължината на низа и 1 байт за всеки знак). Ако съхранявате същия текст в VARCHAR(2000)
или TEXT
колона, също ще изисква същото пространство, но в този случай ще бъде 6 байта (2 байта за съхраняване на дължината на низа и 1 байт за всеки знак).
За повече информация разгледайте документацията .
И накрая, искам да добавя известие, че и двете, TEXT
и VARCHAR
са типове данни с променлива дължина и затова най-вероятно минимизират пространството, от което се нуждаете, за да съхранявате данните. Но това идва с компромис за производителност. Ако имате нужда от по-добра производителност, трябва да използвате тип с фиксирана дължина като CHAR
. Можете да прочетете повече за това тук
.